# load required libraries
library(tidyverse)
library(langcog) # source: https://github.com/langcog/langcog-package
library(psych)
library(lme4)
library(kableExtra)
library(ggdendro)
library(dendextend)
# set theme for ggplots
theme_set(theme_bw())
chosen_rot <- "oblimin"
# run source code (extra home-made functions)
source("./scripts/max_factors_efa.R")
source("./scripts/plot_fun.R")
source("./scripts/reten_fun.R")
source("./scripts/data_prep.R")
NAs introduced by coercionattributes are not identical across measure variables;
they will be droppedJoining, by = "question_qualtrics"
Joining, by = "question"
Joining, by = c("ResponseId", "Q36", "Q36_coded_KH", "Q36_coded_LSK", "Q36_coded_KW", "Q36_coded_KH_simple", "Q36_coded_LSK_simple", "Q36_coded_KW_simple", "MATCH_simple")
Joining, by = c("ResponseId", "attn_free_coded")
Column `ResponseId` joining character vector and factor, coercing into character vectorColumn `attn_free_coded` joining character vector and factor, coercing into character vectorJoining, by = "ResponseId"
Joining, by = "ResponseId"
NAs introduced by coercionJoining, by = "capacity"
Column `capacity` joining character vector and factor, coercing into character vectorJoining, by = "capacity"
Column `capacity` joining character vector and factor, coercing into character vectorJoining, by = "capacity"
Column `capacity` joining character vector and factor, coercing into character vectorJoining, by = "capacity"
Column `capacity` joining character vector and factor, coercing into character vector

“Baby Mental Life: Study 3” was conducted on MTurk on 2019-04-24.

Our planned sample was 300 participants; based on Study 2, we initially recruited 352 participants. After filtering out participants who failed at least one of our attention checks, we ended up retaining 279 participants (retention rate: 85.5%). We then supplemented by recruiting an additional 28 participants, with the goal of attaining our planned sample (300 - 279 = 21 participants, 279/352 * 28 = 22). At each stage, we recruited women and men through separate studies, in hopes of acquiring a roughly equal split between genders.

In the end, we ended up with a sample of 301 participants who passed our attention checks, 252 of whom came from unique GPS coordinates (83.7%).

For this first pass, these data include participants where there is another participant with an identical set of GPS coordinates as recorded by Qualtrics.

Each participant assessed children’s mental capacities at 13 target ages between the ages of 0 and 5 years. For each target, they rated 8 mental capacities on a scale from 0 (not at all capable) to 100 (completely capable). In contrast to Study 2, participants completed all 13 ratings of a particular mental capacity on a single “trial” (rather than completing all 8 ratings of a particular target age on a single trial). In addition, participants answered questions about the “developmental factors” that might contribute to development in this domain.

For more details about the study, see our preregistration here.

Study 1 EFA

# load in EFA results from study 1
efa_S1 <- readRDS("../study 1/s1_efa.rds")
heatmap_fun(efa_S1) + 
  labs(title = paste0("STUDY 1 Parallel Analysis (rotation: ", chosen_rot, ")"),
       subtitle = "'% var.' indicates the amount of shared variance explained (total = 100%)")
Joining, by = "capacity"
Joining, by = "factor"

Plots: Capacity ratings as a function of target age and domain

ggplot(d_cap_rating %>%
         arrange(ResponseId, domain, capacity, target_ord) %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_),
           capacity = gsub("_", " ", capacity)),
       aes(x = target_num, y = response, group = ResponseId,
           color = domain)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  geom_path(alpha = 0.1) +
  geom_smooth(aes(group = capacity), 
              method = "loess", 
              color = "black") +
  scale_x_continuous(breaks = as.numeric(levels(factor(d_cap_rating$target_num))),
                     labels = levels(d_cap_rating$target_ord)) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Perceptions of development, by domain",
       subtitle = "Black line = loess smoothing",
       x = "Target age (numeric)",
       y = "Response (0 = not at all capable, 100 = completely capable)")

ggplot(d_cap_rating %>%
         arrange(ResponseId, domain, capacity, target_ord) %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_),
           capacity = gsub("_", " ", capacity)),
       aes(x = sqrt(target_num), y = response, group = ResponseId,
           color = domain)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  geom_path(alpha = 0.1) +
  geom_smooth(aes(group = capacity), 
              method = "loess", 
              color = "black") +
  scale_x_continuous(breaks = sqrt(as.numeric(levels(factor(d_cap_rating$target_num)))),
                     labels = levels(d_cap_rating$target_ord)) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Perceptions of development, by domain",
       subtitle = "Black line = loess smoothing",
       x = "Target age (numeric, square-root transformed)",
       y = "Response (0 = not at all capable, 100 = completely capable)")

ggplot(d_cap_rating %>%
         arrange(ResponseId, domain, capacity, target_ord) %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_),
           capacity = gsub("_", " ", capacity)),
       aes(x = target_ord, y = response, group = ResponseId,
           color = domain)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  geom_path(alpha = 0.1) +
  geom_smooth(aes(group = capacity), 
              method = "loess", 
              color = "black") +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Perceptions of development, by domain",
       subtitle = "Black line = loess smoothing",
       x = "Target age (ordinal)",
       y = "Response (0 = not at all capable, 100 = completely capable)")

Regression models, version 1: Capacity ratings as a function of target age and domain

contrasts_domain_eff_noCOG <- cbind(BOD = c(1, -1, 0, 0),
                                    NEG = c(0, -1, 1, 0),
                                    POS = c(0, -1, 0, 1))
contrasts_domain_eff_noPOS <- cbind(BOD = c(1, 0, 0, -1),
                                    NEG = c(0, 0, 1, -1),
                                    COG = c(0, 1, 0, -1))
contrasts_domain_eff_noNEG <- cbind(BOD = c(1, 0, -1, 0),
                                    POS = c(0, 0, -1, 1),
                                    COG = c(0, 1, -1, 0))
contrasts_domain_eff_noBOD <- cbind(POS = c(-1, 0, 0, 1),
                                    NEG = c(-1, 0, 1, 0),
                                    COG = c(-1, 1, 0, 0))

Target age in months

Effect-coded (comparing all domains to the grand mean, except “bodily sensations”)

Linear effects only

# r1_noBOD <- lmer(response ~ target_num * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noBOD))
# saveRDS(r1_noBOD, "./models/r1_noBOD.RDS")
r1_noBOD <- readRDS("./models/r1_noBOD.RDS")
summary(r1_noBOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ target_num * domain + (target_num + domain | ResponseId) +  
    (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 275913.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2212 -0.4875  0.0406  0.5273  4.6405 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 115.676  10.755                          
            target_num    9.926   3.151   -0.49                  
            domainCOG   403.013  20.075   -0.55 -0.02            
            domainNEG   402.083  20.052    0.19 -0.49  0.28      
            domainPOS   260.980  16.155   -0.05 -0.41  0.52  0.51
 capacity   (Intercept) 203.077  14.251                          
            target_num    7.030   2.651   -0.89                  
 Residual               348.192  18.660                          
Number of obs: 31304, groups:  ResponseId, 301; capacity, 8

Fixed effects:
                     Estimate Std. Error t value
(Intercept)           55.0228     5.1044  10.780
target_num             8.1378     0.9572   8.502
domainPOS             -3.5835     8.7464  -0.410
domainNEG              9.0183     8.7652   1.029
domainCOG            -44.0243     8.7650  -5.023
target_num:domainPOS   3.7284     1.6278   2.291
target_num:domainNEG  -2.2729     1.6278  -1.396
target_num:domainCOG   5.4199     1.6278   3.330

Non-linear effects

# r2_noBOD <- lmer(response ~ poly(target_num, 3) * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noBOD))
# saveRDS(r2_noBOD, "./models/r2_noBOD.RDS")
r2_noBOD <- readRDS("./models/r2_noBOD.RDS")
summary(r2_noBOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(target_num, 3) * domain + (target_num + domain |  
    ResponseId) + (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 271075.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2790 -0.4882  0.0098  0.5135  5.3651 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 118.031  10.864                          
            target_num   10.123   3.182   -0.49                  
            domainCOG   406.943  20.173   -0.55 -0.02            
            domainNEG   406.006  20.150    0.18 -0.48  0.28      
            domainPOS   264.904  16.276   -0.06 -0.40  0.52  0.51
 capacity   (Intercept) 203.382  14.261                          
            target_num    7.044   2.654   -0.89                  
 Residual               297.181  17.239                          
Number of obs: 31304, groups:  ResponseId, 301; capacity, 8

Fixed effects:
                               Estimate Std. Error t value
(Intercept)                      66.506      3.973  16.739
poly(target_num, 3)1           2270.326    267.286   8.494
poly(target_num, 3)2           -929.790     17.239 -53.936
poly(target_num, 3)3            445.691     17.239  25.854
domainPOS                         1.678      6.808   0.246
domainNEG                         5.811      6.832   0.851
domainCOG                       -36.376      6.831  -5.325
poly(target_num, 3)1:domainPOS 1040.177    454.392   2.289
poly(target_num, 3)2:domainPOS -937.701     29.859 -31.405
poly(target_num, 3)3:domainPOS  559.497     29.859  18.738
poly(target_num, 3)1:domainNEG -634.099    454.392  -1.395
poly(target_num, 3)2:domainNEG  165.960     29.859   5.558
poly(target_num, 3)3:domainNEG  -87.169     29.859  -2.919
poly(target_num, 3)1:domainCOG 1512.077    454.392   3.328
poly(target_num, 3)2:domainCOG   74.583     29.859   2.498
poly(target_num, 3)3:domainCOG -189.126     29.859  -6.334

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

Effect-coded (comparing all domains to the grand mean, except “negative emotions”)

Linear effects only

# r1_noNEG <- lmer(response ~ target_num * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noNEG))
# saveRDS(r1_noNEG, "./models/r1_noNEG.RDS")
r1_noNEG <- readRDS("./models/r1_noNEG.RDS")
summary(r1_noNEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ target_num * domain + (target_num + domain | ResponseId) +  
    (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 275913.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2212 -0.4875  0.0406  0.5273  4.6405 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 115.676  10.755                          
            target_num    9.926   3.151   -0.49                  
            domainCOG   403.022  20.075   -0.55 -0.02            
            domainNEG   402.081  20.052    0.19 -0.49  0.28      
            domainPOS   260.982  16.155   -0.05 -0.41  0.52  0.51
 capacity   (Intercept) 203.390  14.261                          
            target_num    7.039   2.653   -0.89                  
 Residual               348.192  18.660                          
Number of obs: 31304, groups:  ResponseId, 301; capacity, 8

Fixed effects:
                     Estimate Std. Error t value
(Intercept)           55.0228     5.1082  10.772
target_num             8.1378     0.9578   8.497
domainBOD             38.5896     8.7600   4.405
domainPOS             -3.5835     8.7531  -0.409
domainCOG            -44.0243     8.7717  -5.019
target_num:domainBOD  -6.8755     1.6288  -4.221
target_num:domainPOS   3.7284     1.6288   2.289
target_num:domainCOG   5.4199     1.6288   3.328

Non-linear effects

# r2_noNEG <- lmer(response ~ poly(target_num, 3) * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noNEG))
# saveRDS(r2_noNEG, "./models/r2_noNEG.RDS")
r2_noNEG <- readRDS("./models/r2_noNEG.RDS")
summary(r2_noNEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(target_num, 3) * domain + (target_num + domain |  
    ResponseId) + (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 271075.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2790 -0.4882  0.0098  0.5135  5.3651 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 118.030  10.864                          
            target_num   10.124   3.182   -0.49                  
            domainCOG   406.935  20.173   -0.55 -0.02            
            domainNEG   406.006  20.150    0.18 -0.48  0.28      
            domainPOS   264.902  16.276   -0.06 -0.40  0.52  0.51
 capacity   (Intercept) 203.225  14.256                          
            target_num    7.039   2.653   -0.89                  
 Residual               297.181  17.239                          
Number of obs: 31304, groups:  ResponseId, 301; capacity, 8

Fixed effects:
                                Estimate Std. Error t value
(Intercept)                       66.506      3.972  16.745
poly(target_num, 3)1            2270.326    267.205   8.497
poly(target_num, 3)2            -929.790     17.239 -53.936
poly(target_num, 3)3             445.691     17.239  25.854
domainBOD                         28.888      6.814   4.240
domainPOS                          1.678      6.805   0.247
domainCOG                        -36.376      6.829  -5.327
poly(target_num, 3)1:domainBOD -1918.156    454.249  -4.223
poly(target_num, 3)2:domainBOD   697.158     29.859  23.349
poly(target_num, 3)3:domainBOD  -283.202     29.859  -9.485
poly(target_num, 3)1:domainPOS  1040.177    454.249   2.290
poly(target_num, 3)2:domainPOS  -937.701     29.859 -31.405
poly(target_num, 3)3:domainPOS   559.497     29.859  18.738
poly(target_num, 3)1:domainCOG  1512.077    454.249   3.329
poly(target_num, 3)2:domainCOG    74.583     29.859   2.498
poly(target_num, 3)3:domainCOG  -189.126     29.859  -6.334

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

Effect-coded (comparing all domains to the grand mean, except “social abilities & positive emotions”)

Linear effects only

# r1_noPOS <- lmer(response ~ target_num * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noPOS))
# saveRDS(r1_noPOS, "./models/r1_noPOS.RDS")
r1_noPOS <- readRDS("./models/r1_noPOS.RDS")
summary(r1_noPOS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ target_num * domain + (target_num + domain | ResponseId) +  
    (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 275913.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2212 -0.4875  0.0406  0.5273  4.6405 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 115.677  10.755                          
            target_num    9.926   3.151   -0.49                  
            domainCOG   403.016  20.075   -0.55 -0.02            
            domainNEG   402.080  20.052    0.19 -0.49  0.28      
            domainPOS   260.980  16.155   -0.05 -0.41  0.52  0.51
 capacity   (Intercept) 203.232  14.256                          
            target_num    7.035   2.652   -0.89                  
 Residual               348.192  18.660                          
Number of obs: 31304, groups:  ResponseId, 301; capacity, 8

Fixed effects:
                     Estimate Std. Error t value
(Intercept)           55.0228     5.1062  10.776
target_num             8.1378     0.9575   8.499
domainBOD             38.5896     8.7566   4.407
domainNEG              9.0183     8.7685   1.028
domainCOG            -44.0243     8.7683  -5.021
target_num:domainBOD  -6.8755     1.6283  -4.222
target_num:domainNEG  -2.2729     1.6283  -1.396
target_num:domainCOG   5.4199     1.6283   3.329

Non-linear effects

# r2_noPOS <- lmer(response ~ poly(target_num, 3) * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noPOS))
# saveRDS(r2_noPOS, "./models/r2_noPOS.RDS")
r2_noPOS <- readRDS("./models/r2_noPOS.RDS")
summary(r2_noPOS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(target_num, 3) * domain + (target_num + domain |  
    ResponseId) + (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 271075.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2790 -0.4882  0.0098  0.5135  5.3651 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 118.031  10.864                          
            target_num   10.123   3.182   -0.49                  
            domainCOG   406.944  20.173   -0.55 -0.02            
            domainNEG   406.007  20.150    0.18 -0.48  0.28      
            domainPOS   264.906  16.276   -0.06 -0.40  0.52  0.51
 capacity   (Intercept) 203.411  14.262                          
            target_num    7.044   2.654   -0.89                  
 Residual               297.181  17.239                          
Number of obs: 31304, groups:  ResponseId, 301; capacity, 8

Fixed effects:
                                Estimate Std. Error t value
(Intercept)                       66.506      3.973  16.738
poly(target_num, 3)1            2270.326    267.297   8.494
poly(target_num, 3)2            -929.790     17.239 -53.936
poly(target_num, 3)3             445.691     17.239  25.854
domainBOD                         28.888      6.817   4.238
domainNEG                          5.811      6.832   0.851
domainCOG                        -36.376      6.832  -5.325
poly(target_num, 3)1:domainBOD -1918.156    454.412  -4.221
poly(target_num, 3)2:domainBOD   697.158     29.859  23.349
poly(target_num, 3)3:domainBOD  -283.202     29.859  -9.485
poly(target_num, 3)1:domainNEG  -634.099    454.412  -1.395
poly(target_num, 3)2:domainNEG   165.960     29.859   5.558
poly(target_num, 3)3:domainNEG   -87.169     29.859  -2.919
poly(target_num, 3)1:domainCOG  1512.077    454.412   3.328
poly(target_num, 3)2:domainCOG    74.583     29.859   2.498
poly(target_num, 3)3:domainCOG  -189.126     29.859  -6.334

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

Effect-coded (comparing all domains to the grand mean, except “cognition & control”)

Linear effects only

# r1_noCOG <- lmer(response ~ target_num * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noCOG))
# saveRDS(r1_noCOG, "./models/r1_noCOG.RDS")
r1_noCOG <- readRDS("./models/r1_noCOG.RDS")
summary(r1_noCOG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ target_num * domain + (target_num + domain | ResponseId) +  
    (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 275913.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2212 -0.4875  0.0406  0.5273  4.6405 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 115.677  10.755                          
            target_num    9.926   3.151   -0.49                  
            domainCOG   403.014  20.075   -0.55 -0.02            
            domainNEG   402.089  20.052    0.19 -0.49  0.28      
            domainPOS   260.979  16.155   -0.05 -0.41  0.52  0.51
 capacity   (Intercept) 203.084  14.251                          
            target_num    7.030   2.651   -0.89                  
 Residual               348.192  18.660                          
Number of obs: 31304, groups:  ResponseId, 301; capacity, 8

Fixed effects:
                     Estimate Std. Error t value
(Intercept)           55.0228     5.1044  10.779
target_num             8.1378     0.9572   8.502
domainBOD             38.5896     8.7534   4.409
domainNEG              9.0183     8.7653   1.029
domainPOS             -3.5835     8.7466  -0.410
target_num:domainBOD  -6.8755     1.6278  -4.224
target_num:domainNEG  -2.2729     1.6278  -1.396
target_num:domainPOS   3.7284     1.6278   2.290

Non-linear effects

# r2_noCOG <- lmer(response ~ poly(target_num, 3) * domain
#                  + (target_num + domain | ResponseId)
#                  + (target_num | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12),
#                  contrasts = list(domain = contrasts_domain_eff_noCOG))
# saveRDS(r2_noCOG, "./models/r2_noCOG.RDS")
r2_noCOG <- readRDS("./models/r2_noCOG.RDS")
summary(r2_noCOG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(target_num, 3) * domain + (target_num + domain |  
    ResponseId) + (target_num | capacity)
   Data: d_cap_rating %>% mutate(target_num = target_num/12)

REML criterion at convergence: 271075.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.2790 -0.4882  0.0098  0.5135  5.3651 

Random effects:
 Groups     Name        Variance Std.Dev. Corr                   
 ResponseId (Intercept) 118.029  10.864                          
            target_num   10.124   3.182   -0.49                  
            domainCOG   406.933  20.173   -0.55 -0.02            
            domainNEG   406.008  20.150    0.18 -0.48  0.28      
            domainPOS   264.906  16.276   -0.06 -0.40  0.52  0.51
 capacity   (Intercept) 203.498  14.265                          
            target_num    7.046   2.654   -0.89                  
 Residual               297.181  17.239                          
Number of obs: 31304, groups:  ResponseId, 301; capacity, 8

Fixed effects:
                                Estimate Std. Error t value
(Intercept)                       66.506      3.974  16.734
poly(target_num, 3)1            2270.326    267.336   8.492
poly(target_num, 3)2            -929.790     17.239 -53.936
poly(target_num, 3)3             445.691     17.239  25.854
domainBOD                         28.888      6.818   4.237
domainNEG                          5.811      6.834   0.850
domainPOS                          1.678      6.809   0.246
poly(target_num, 3)1:domainBOD -1918.156    454.480  -4.221
poly(target_num, 3)2:domainBOD   697.158     29.859  23.349
poly(target_num, 3)3:domainBOD  -283.202     29.859  -9.485
poly(target_num, 3)1:domainNEG  -634.099    454.480  -1.395
poly(target_num, 3)2:domainNEG   165.960     29.859   5.558
poly(target_num, 3)3:domainNEG   -87.169     29.859  -2.919
poly(target_num, 3)1:domainPOS  1040.177    454.480   2.289
poly(target_num, 3)2:domainPOS  -937.701     29.859 -31.405
poly(target_num, 3)3:domainPOS   559.497     29.859  18.738

Correlation matrix not shown by default, as p = 16 > 12.
Use print(x, correlation=TRUE)  or
     vcov(x)     if you need it

Target age in months (square-root transformation)

NOTE: All of these models fail to meet our criterion of random effects being correlation < 0.90. Because of this, I have not included in this print-out and I have not yet modeled non-linear effects after square-root transformation. The next step will be to try simpler random effects models (with fewer random slopes).

Regression models, version 2: Capacity ratings as a function of target age, for each domain separately

NOTE: All of the preregistered models fail to meet our criterion of random effects being correlation < 0.90. Because of this, I instead used simpler random effects models (with fewer random slopes), as indicated in the preregistration.

Target age in months

Bodily sensations

Linear effects only

# r5a_BOD <- lmer(response ~ target_num
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "BOD"))
# saveRDS(r5a_BOD, "./models/r5a_BOD.RDS")
r5a_BOD <- readRDS("./models/r5a_BOD.RDS")
summary(r5a_BOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ target_num + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "BOD")

REML criterion at convergence: 59314.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-8.2674 -0.1305  0.0997  0.2482  3.8964 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept)  97.626   9.881  
 capacity   (Intercept)   1.135   1.066  
 Residual               101.015  10.051  
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
            Estimate Std. Error t value
(Intercept) 93.61241    0.95668   97.85
target_num   1.26233    0.07205   17.52

Non-linear effects

# r6a_BOD <- lmer(response ~ poly(target_num, 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "BOD"))
# saveRDS(r6a_BOD, "./models/r6a_BOD.RDS")
r6a_BOD <- readRDS("./models/r6a_BOD.RDS")
summary(r6a_BOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ poly(target_num, 3) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "BOD")

REML criterion at convergence: 59090.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-8.1734 -0.2154  0.0249  0.3262  4.1567 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 97.728   9.886   
 capacity   (Intercept)  1.136   1.066   
 Residual               98.365   9.918   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                      Estimate Std. Error t value
(Intercept)            95.3937     0.9514 100.262
poly(target_num, 3)1  176.0851     9.9179  17.754
poly(target_num, 3)2 -116.3162     9.9179 -11.728
poly(target_num, 3)3   81.2443     9.9179   8.192

Negative emotions

Linear effects only

# r5a_NEG <- lmer(response ~ target_num
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "NEG"))
# saveRDS(r5a_NEG, "./models/r5a_NEG.RDS")
r5a_NEG <- readRDS("./models/r5a_NEG.RDS")
summary(r5a_NEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ target_num + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "NEG")

REML criterion at convergence: 72902.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.8109 -0.5686  0.0777  0.7164  3.1800 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 476.5    21.83   
 capacity   (Intercept) 241.9    15.55   
 Residual               576.7    24.01   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
            Estimate Std. Error t value
(Intercept)  64.0411    11.0765   5.782
target_num    5.8649     0.1721  34.069

Non-linear effects

# r6a_NEG <- lmer(response ~ poly(target_num, 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "NEG"))
# saveRDS(r6a_NEG, "./models/r6a_NEG.RDS")
r6a_NEG <- readRDS("./models/r6a_NEG.RDS")
summary(r6a_NEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ poly(target_num, 3) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "NEG")

REML criterion at convergence: 72561.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.6464 -0.6310  0.0716  0.6993  3.4952 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 477.4    21.85   
 capacity   (Intercept) 241.9    15.55   
 Residual               553.1    23.52   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                     Estimate Std. Error t value
(Intercept)             72.32      11.07   6.530
poly(target_num, 3)1   818.11      23.52  34.785
poly(target_num, 3)2  -381.91      23.52 -16.239
poly(target_num, 3)3   179.26      23.52   7.622

Social abilities & positive emotions

Linear effects only

# r5a_POS <- lmer(response ~ target_num
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "POS"))
# saveRDS(r5a_POS, "./models/r5a_POS.RDS")
r5a_POS <- readRDS("./models/r5a_POS.RDS")
summary(r5a_POS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ target_num + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "POS")

REML criterion at convergence: 72705.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.5238 -0.6993  0.0891  0.7527  2.5495 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 265.2    16.28   
 capacity   (Intercept) 224.9    15.00   
 Residual               574.2    23.96   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
            Estimate Std. Error t value
(Intercept)  51.4393    10.6530   4.829
target_num   11.8662     0.1718  69.074

Non-linear effects

# r6a_POS <- lmer(response ~ poly(target_num, 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "POS"))
# saveRDS(r6a_POS, "./models/r6a_POS.RDS")
r6a_POS <- readRDS("./models/r6a_POS.RDS")
summary(r6a_POS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ poly(target_num, 3) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "POS")

REML criterion at convergence: 70411.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.4282 -0.6867 -0.0371  0.6625  3.2121 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 270.9    16.46   
 capacity   (Intercept) 225.0    15.00   
 Residual               424.9    20.61   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                     Estimate Std. Error t value
(Intercept)             68.18      10.65   6.401
poly(target_num, 3)1  1655.25      20.61  80.302
poly(target_num, 3)2  -933.75      20.61 -45.299
poly(target_num, 3)3   502.59      20.61  24.383

Negative emotions

Linear effects only

# r5a_COG <- lmer(response ~ target_num
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "COG"))
# saveRDS(r5a_COG, "./models/r5a_COG.RDS")
r5a_COG <- readRDS("./models/r5a_COG.RDS")
summary(r5a_COG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ target_num + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "COG")

REML criterion at convergence: 67265.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.1158 -0.6063 -0.0316  0.5361  4.0924 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 254.66   15.958  
 capacity   (Intercept)  22.37    4.729  
 Residual               279.59   16.721  
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
            Estimate Std. Error t value
(Intercept)  10.9985     3.4776   3.163
target_num   13.5577     0.1199 113.104

Non-linear effects

# r6a_COG <- lmer(response ~ poly(target_num, 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "COG"))
# saveRDS(r6a_COG, "./models/r6a_COG.RDS")
r6a_COG <- readRDS("./models/r6a_COG.RDS")
summary(r6a_COG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ poly(target_num, 3) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "COG")

REML criterion at convergence: 66491.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.8966 -0.6171 -0.0328  0.5891  4.1837 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 255.68   15.99   
 capacity   (Intercept)  22.37    4.73   
 Residual               253.16   15.91   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                     Estimate Std. Error t value
(Intercept)            30.130      3.474   8.673
poly(target_num, 3)1 1891.202     15.911 118.860
poly(target_num, 3)2 -427.604     15.911 -26.874
poly(target_num, 3)3  128.282     15.911   8.062

Target age in months (square-root transformation)

Bodily sensations

Linear effects only

# r7a_BOD <- lmer(response ~ sqrt(target_num)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "BOD"))
# saveRDS(r7a_BOD, "./models/r7a_BOD.RDS")
r7a_BOD <- readRDS("./models/r7a_BOD.RDS")
summary(r7a_BOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ sqrt(target_num) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "BOD")

REML criterion at convergence: 59164.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-8.1883 -0.2061  0.0803  0.2887  4.0990 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 97.702   9.884   
 capacity   (Intercept)  1.136   1.066   
 Residual               99.036   9.952   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       92.0086     0.9643   95.42
sqrt(target_num)   3.5037     0.1628   21.53

Non-linear effects

# r8a_BOD <- lmer(response ~ poly(sqrt(target_num), 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "BOD"))
# saveRDS(r8a_BOD, "./models/r8a_BOD.RDS")
r8a_BOD <- readRDS("./models/r8a_BOD.RDS")
summary(r8a_BOD, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(sqrt(target_num), 3) + (1 | ResponseId) + (1 |  
    capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "BOD")

REML criterion at convergence: 59012.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-8.0365 -0.2069 -0.0311  0.3508  4.3998 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 97.767   9.888   
 capacity   (Intercept)  1.136   1.066   
 Residual               97.350   9.867   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                            Estimate Std. Error t value
(Intercept)                  95.3937     0.9515 100.255
poly(sqrt(target_num), 3)1  214.2262     9.8666  21.712
poly(sqrt(target_num), 3)2 -106.5941     9.8666 -10.804
poly(sqrt(target_num), 3)3   38.9803     9.8666   3.951

Negative emotions

Linear effects only

# r7a_NEG <- lmer(response ~ sqrt(target_num)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "NEG"))
# saveRDS(r7a_NEG, "./models/r7a_NEG.RDS")
r7a_NEG <- readRDS("./models/r7a_NEG.RDS")
summary(r7a_NEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ sqrt(target_num) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "NEG")

REML criterion at convergence: 72630.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.7869 -0.6042  0.0780  0.6935  3.4966 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 477.3    21.85   
 capacity   (Intercept) 241.9    15.55   
 Residual               556.3    23.59   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       57.9857    11.0802   5.233
sqrt(target_num)  14.8338     0.3857  38.455

Non-linear effects

# r8a_NEG <- lmer(response ~ poly(sqrt(target_num), 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "NEG"))
# saveRDS(r8a_NEG, "./models/r8a_NEG.RDS")
r8a_NEG <- readRDS("./models/r8a_NEG.RDS")
summary(r8a_NEG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(sqrt(target_num), 3) + (1 | ResponseId) + (1 |  
    capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "NEG")

REML criterion at convergence: 72538.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.6105 -0.6399  0.0577  0.6911  3.6371 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 477.5    21.85   
 capacity   (Intercept) 241.9    15.55   
 Residual               551.5    23.48   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                           Estimate Std. Error t value
(Intercept)                   72.32      11.07   6.530
poly(sqrt(target_num), 3)1   906.98      23.48  38.622
poly(sqrt(target_num), 3)2  -190.43      23.48  -8.109
poly(sqrt(target_num), 3)3   -31.35      23.48  -1.335

Social abilities & positive emotions

Linear effects only

# r7a_POS <- lmer(response ~ sqrt(target_num)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "POS"))
# saveRDS(r7a_POS, "./models/r7a_POS.RDS")
r7a_POS <- readRDS("./models/r7a_POS.RDS")
summary(r7a_POS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ sqrt(target_num) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "POS")

REML criterion at convergence: 71052.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.4808 -0.7208  0.0173  0.6979  3.0119 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 269.5    16.42   
 capacity   (Intercept) 225.0    15.00   
 Residual               461.0    21.47   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       38.2384    10.6562   3.588
sqrt(target_num)  30.9952     0.3512  88.260

Non-linear effects

# r8a_POS <- lmer(response ~ poly(sqrt(target_num), 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "POS"))
# saveRDS(r8a_POS, "./models/r8a_POS.RDS")
r8a_POS <- readRDS("./models/r8a_POS.RDS")
summary(r8a_POS, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(sqrt(target_num), 3) + (1 | ResponseId) + (1 |  
    capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "POS")

REML criterion at convergence: 70222.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.3242 -0.6891 -0.0254  0.6543  3.6761 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 271.3    16.47   
 capacity   (Intercept) 225.0    15.00   
 Residual               414.3    20.36   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                           Estimate Std. Error t value
(Intercept)                   68.18      10.65   6.402
poly(sqrt(target_num), 3)1  1895.12      20.36  93.103
poly(sqrt(target_num), 3)2  -592.59      20.36 -29.113
poly(sqrt(target_num), 3)3   -33.48      20.36  -1.645

Cognition & control

Linear effects only

# r7a_COG <- lmer(response ~ sqrt(target_num)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "COG"))
# saveRDS(r7a_COG, "./models/r7a_COG.RDS")
r7a_COG <- readRDS("./models/r7a_COG.RDS")
summary(r7a_COG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ sqrt(target_num) + (1 | ResponseId) + (1 | capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "COG")

REML criterion at convergence: 66686.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.7865 -0.6315 -0.0466  0.5966  3.9492 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 255.45   15.98   
 capacity   (Intercept)  22.37    4.73   
 Residual               258.94   16.09   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       -0.3958     3.4832  -0.114
sqrt(target_num)  31.5957     0.2632 120.054

Non-linear effects

# r8a_COG <- lmer(response ~ poly(sqrt(target_num), 3)
#                  + (1 | ResponseId)
#                  + (1 | capacity),
#                  d_cap_rating %>%
#                    mutate(target_num = target_num/12) %>%
#                    filter(domain == "COG"))
# saveRDS(r8a_COG, "./models/r8a_COG.RDS")
r8a_COG <- readRDS("./models/r8a_COG.RDS")
summary(r8a_COG, corr = F)
Linear mixed model fit by REML ['lmerMod']
Formula: response ~ poly(sqrt(target_num), 3) + (1 | ResponseId) + (1 |  
    capacity)
   Data: 
d_cap_rating %>% mutate(target_num = target_num/12) %>% filter(domain ==  
    "COG")

REML criterion at convergence: 66507.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.8256 -0.6153 -0.0351  0.5816  4.1614 

Random effects:
 Groups     Name        Variance Std.Dev.
 ResponseId (Intercept) 255.66   15.99   
 capacity   (Intercept)  22.37    4.73   
 Residual               253.70   15.93   
Number of obs: 7826, groups:  ResponseId, 301; capacity, 2

Fixed effects:
                           Estimate Std. Error t value
(Intercept)                  30.130      3.474   8.673
poly(sqrt(target_num), 3)1 1931.843     15.928 121.286
poly(sqrt(target_num), 3)2  128.315     15.928   8.056
poly(sqrt(target_num), 3)3 -153.107     15.928  -9.612

Plots: Ratings for developmental factors, by domain and capacity

ggplot(d_dev_factor_rating %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate_at(vars(capacity, dev_factor),
                   funs(gsub("_", " ", .))) %>%
         mutate(dev_factor = factor(
           dev_factor,
           levels = gsub("_", " ", levels(d_dev_factor_rating$dev_factor)))),
       aes(x = dev_factor, y = response, color = domain)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  geom_jitter(alpha = 0.025, height = 0.2, width = 0.2) +
  geom_pointrange(data = . %>% group_by(domain, capacity, dev_factor) %>%
                    multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  color = "black", fatten = 4) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Ratings of developmental factors (Version 1)",
       subtitle = "Error bars are bootstrapped 95% CIs",
       x = "Developmental factor", 
       y = "Response (0 = plays no role, 6 = plays a very important role)")

ggplot(d_dev_factor_rating %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate_at(vars(capacity, dev_factor),
                   funs(gsub("_", " ", .))) %>%
         mutate(dev_factor = factor(
           dev_factor,
           levels = gsub("_", " ", levels(d_dev_factor_rating$dev_factor)))),
       aes(x = reorder(capacity, as.numeric(domain)), 
           y = response, color = domain)) +
  facet_wrap(~ dev_factor, ncol = 5) +
  geom_jitter(alpha = 0.025, height = 0.2, width = 0.2) +
  geom_pointrange(data = . %>% group_by(domain, capacity, dev_factor) %>%
                    multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  color = "black", fatten = 4) +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  guides(color = guide_legend(override.aes = list(alpha = 1, size = 3))) +
  labs(title = "Ratings of developmental factors (Version 2)",
       subtitle = "Error bars are bootstrapped 95% CIs",
       color = "Domain",
       x = "Capacity (by domain)", 
       y = "Response (0 = plays no role, 6 = plays a very important role)")

ggplot(d_dev_factor_rating %>%
         mutate(dev_factor = factor(
           gsub("_", " ", dev_factor),
           levels = gsub("_", " ", levels(d_dev_factor_rating$dev_factor)))),
       aes(x = dev_factor, y = response)) +
  geom_jitter(alpha = 0.01, height = 0.3, width = 0.3, color = "blue") +
  geom_pointrange(data = . %>% group_by(dev_factor) %>%
                    multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  color = "black", fatten = 2) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Ratings of developmental factors (Version 3)",
       subtitle = "Error bars are bootstrapped 95% CIs",
       x = "Developmental factor", 
       y = "Response (0 = plays no role, 6 = plays a very important role)")

Exploration: EFA/clustering of developmental factors

It could be nice to reduce the number of “devleopmental factors” from 10 down to something more manageable for analysis. Here I explore EFA and hierarchical clustering as dimension reduction methods, and re-plot with these results in mind.

Parallel to what we’ve done for dimensionality reduction across capacities, to do this I’ll ignore some aspects of the within-subjects design of this study. I’ll consider each combination of participant and capacity to be a separate set of observations for this analysis (effectively, acting as though each participant were really 8 different participants, each of whom evaluated a different capacity on the 10 developmental factors included in the study).

d_dev_factor_rating_wide <- d_dev_factor_rating %>%
  unite(key, ResponseId, domain, capacity) %>%
  # mutate(response = response - 3) %>% # center at 0
  spread(dev_factor, response) %>%
  column_to_rownames("key")

Exploratory factor analysis

reten_fun(d_dev_factor_rating_wide, chosen_rot)
[1] 2
fa.parallel(d_dev_factor_rating_wide)
Parallel analysis suggests that the number of factors =  4  and the number of components =  2 

VSS(d_dev_factor_rating_wide, rotate = chosen_rot)
convergence not obtained in GPFoblq. 1000 iterations used.convergence not obtained in GPFoblq. 1000 iterations used.

Very Simple Structure
Call: vss(x = x, n = n, rotate = rotate, diagonal = diagonal, fm = fm, 
    n.obs = n.obs, plot = plot, title = title, use = use, cor = cor)
VSS complexity 1 achieves a maximimum of 0.82  with  1  factors
VSS complexity 2 achieves a maximimum of 0.9  with  2  factors

The Velicer MAP achieves a minimum of 0.05  with  2  factors 
BIC achieves a minimum of  NA  with  5  factors
Sample Size adjusted BIC achieves a minimum of  NA  with  5  factors

Statistics by number of factors 

Different factor retention protocols suggest retaining different numbers of factors (2, 4, or 5):

dev_factor_rating_efa2 <- fa(d_dev_factor_rating_wide,
                             nfactors = 2,
                             rotate = chosen_rot)
heatmap_fun(dev_factor_rating_efa2) + 
  guides(fill = guide_colorbar(barheight = 8, barwidth = 0.5)) +
  labs(title = "EFA of developmental factor ratings",
       subtitle = "Retaining 2 factors (retention protocol: Weisman et al., 2017)")
Joining, by = "capacity"
Joining, by = "factor"

dev_factor_rating_efa4 <- fa(d_dev_factor_rating_wide,
                             nfactors = 4,
                             rotate = chosen_rot)
heatmap_fun(dev_factor_rating_efa4) + 
  guides(fill = guide_colorbar(barheight = 8, barwidth = 0.5)) +
  labs(title = "EFA of developmental factor ratings",
       subtitle = "Retaining 4 factors (retention protocol: parallel analysis)")
Joining, by = "capacity"
Joining, by = "factor"

dev_factor_rating_efa5 <- fa(d_dev_factor_rating_wide,
                             nfactors = 5,
                             rotate = chosen_rot)
heatmap_fun(dev_factor_rating_efa5) + 
  guides(fill = guide_colorbar(barheight = 8, barwidth = 0.5)) +
  labs(title = "EFA of developmental factor ratings",
       subtitle = "Retaining 5 factors (retention protocol: minimizing BIC)")
Joining, by = "capacity"
Joining, by = "factor"

The 2- and 4-factor solutions each seem to offer some advantages… the 5-factor solution is sensible too, it just doesn’t offer much in the way of reducing the dataset!

Hierarchical clustering

dev_factor_rating_hclust <- d_dev_factor_rating_wide %>%
  t() %>%
  dist() %>%
  hclust()
# dev_factor_rating_hclust_order <- data.frame(
#   order = as.numeric(dev_factor_rating_hclust$order), 
#   dev_factor = as.character(dev_factor_rating_hclust$labels))
# cannot figure out how to do this automatically!
dev_factor_rating_hclust_order <- c("experiments", "people_teach",
                                    "brain_changes", "observes_objects", 
                                    "observes_people", "interacts_people", 
                                    "preprogrammed", "womb_experiences", 
                                    "body_grows", "senses_improve")
dev_factor_rating_hclust %>%
  ggdendrogram(rotate = F) +
  theme_minimal() +
  theme(#axis.title = element_blank(),
        # axis.text.y = element_blank(), 
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1),
        panel.grid.major.x = element_blank(),
        panel.grid.minor.x = element_blank()) +
  labs(title = "Hierarchical agglomerative clustering", 
       subtitle = "Complete linkage (default for stats::hclust() function)",
       x = "Developmental factor", y = "Height")

  # as.dendrogram() %>%
  # set("labels_col", k = 2) %>%
  # plot(horiz = T, xlim = c(-100, 200))

This looks a lot like the 2-factor EFA solution to me!

Re-plotting by cluster

Let’s proceed with the clustering of developmental factors suggested by the 2-factor EFA solution and by hierarchical clustering.

d_dev_factor_rating_byclust <- d_dev_factor_rating %>%
  mutate(dev_factor_cluster = case_when(
    dev_factor %in% c("experiments", "people_teach", "brain_changes", 
                      "observes_objects", "observes_people", 
                      "interacts_people") ~ "extrinsic",
    dev_factor %in% c("preprogrammed", "womb_experiences", "body_grows", 
                      "senses_improve") ~ "intrinsic",
    TRUE ~ NA_character_)) %>%
  mutate(dev_factor_cluster = factor(dev_factor_cluster),
         dev_factor = factor(dev_factor,
                             levels = dev_factor_rating_hclust_order),
         response_cent = response - 3)
contrasts_cluster_eff <- cbind(EXT = c(1, -1))
ggplot(d_dev_factor_rating_byclust %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate_at(vars(capacity, dev_factor),
                   funs(gsub("_", " ", .))) %>%
         mutate(dev_factor = factor(
           dev_factor,
           levels = gsub("_", " ", dev_factor_rating_hclust_order))),
       aes(x = dev_factor, 
           y = response, color = domain, shape = dev_factor_cluster)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  geom_jitter(alpha = 0.025, height = 0.2, width = 0.2, show.legend = F) +
  geom_pointrange(data = . %>% group_by(domain, capacity, 
                                        dev_factor_cluster, dev_factor) %>%
                    multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  color = "black", fatten = 4) +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Ratings of developmental factors (Version 1)",
       subtitle = "Error bars are bootstrapped 95% CIs",
       shape = "Type of developmental factor (per EFA/clustering)",
       x = "Developmental factor", 
       y = "Response (0 = plays no role, 6 = plays a very important role)")

ggplot(d_dev_factor_rating_byclust %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate_at(vars(capacity),
                   funs(gsub("_", " ", .))),
       aes(x = reorder(capacity, as.numeric(domain)), 
           y = response, color = domain)) +
  facet_wrap(dev_factor_cluster ~ dev_factor, ncol = 6) +
  geom_jitter(alpha = 0.025, height = 0.2, width = 0.2) +
  geom_pointrange(data = . %>% group_by(domain, capacity, 
                                        dev_factor_cluster, dev_factor) %>%
                    multi_boot_standard(col = "response", na.rm = T),
                  aes(y = mean, ymin = ci_lower, ymax = ci_upper),
                  color = "black", fatten = 4) +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  guides(color = guide_legend(override.aes = list(alpha = 1, size = 3))) +
  labs(title = "Ratings of developmental factors (Version 3)",
       subtitle = "Error bars are bootstrapped 95% CIs",
       color = "Domain",
       x = "Capacity (by domain)", 
       y = "Response (0 = plays no role, 6 = plays a very important role)")

r_dev_factor_rating <- lmer(response ~ domain * dev_factor_cluster + 
                              # (domain + dev_factor_cluster | ResponseId) +
                              # NOTE: including both random intercepts 
                              # yields corr > 0.9
                              (1 + dev_factor_cluster | ResponseId) +
                              (1 | capacity) + (1 | dev_factor),
                            d_dev_factor_rating_byclust,
                            contrasts = list(
                              domain = contrasts_domain_eff_noBOD,
                              dev_factor_cluster = contrasts_cluster_eff))
summary(r_dev_factor_rating)
Linear mixed model fit by REML ['lmerMod']
Formula: 
response ~ domain * dev_factor_cluster + (1 + dev_factor_cluster |  
    ResponseId) + (1 | capacity) + (1 | dev_factor)
   Data: d_dev_factor_rating_byclust

REML criterion at convergence: 94588.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.2100 -0.7160  0.0053  0.7145  3.4784 

Random effects:
 Groups     Name                        Variance Std.Dev. Corr 
 ResponseId (Intercept)                 0.78302  0.8849        
            dev_factor_clusterintrinsic 0.33241  0.5765   -0.19
 dev_factor (Intercept)                 0.46271  0.6802        
 capacity   (Intercept)                 0.09071  0.3012        
 Residual                               2.80683  1.6754        
Number of obs: 24080, groups:  
ResponseId, 301; dev_factor, 10; capacity, 8

Fixed effects:
                                Estimate Std. Error t value
(Intercept)                      3.15782    0.24942  12.661
domainPOS                        0.56248    0.18542   3.034
domainNEG                       -0.22905    0.18542  -1.235
domainCOG                        0.21295    0.18542   1.148
dev_factor_clusterEXT            0.34626    0.22045   1.571
domainPOS:dev_factor_clusterEXT  0.33709    0.01909  17.662
domainNEG:dev_factor_clusterEXT -0.11557    0.01909  -6.055
domainCOG:dev_factor_clusterEXT  0.85384    0.01909  44.737

Correlation of Fixed Effects:
            (Intr) dmnPOS dmnNEG dmnCOG d__EXT dPOS:_ dNEG:_
domainPOS    0.000                                          
domainNEG    0.000 -0.333                                   
domainCOG    0.000 -0.333 -0.333                            
dv_fctr_EXT -0.178  0.000  0.000  0.000                     
dmPOS:__EXT  0.000 -0.021  0.007  0.007  0.000              
dmNEG:__EXT  0.000  0.007 -0.021  0.007  0.000 -0.333       
dmCOG:__EXT  0.000  0.007  0.007 -0.021  0.000 -0.333 -0.333

(Note that domain was effect-coded and leaves out the bodily sensations domain here, but we could re-code it in all the different ways to get the contrast between bodily sensations and the grand mean as desired.)

I see three take-aways from these regression results, all of which I think I can see reflected in the plots above:

  1. Participants perceived the domain of social connection and positive emotions to be particularly dramatically shaped by the set of developmental factors we included in this study (relative to the grand mean collapsing across domains).
  2. On the whole, participants endorsed “extrinsic” and “intrinsic” developmental factors equally strongly. If we were mapping this onto some sort of nature-nuruture distinction (not perfect, but tempting), I think we’d say that there’s no evidence for participants favoring either nature or nurture over the other as an explanation for growth in the capacities we included in this study.
  3. However, their endorsement of “extrinsic” and “intrinsic” developmental factors varied by domain. They perceived “extrinsic” factors to play a larger role in the domains of social connection and positive emotions and especially cognition and control, and a relatively small role in the domain of negative emotions. (Looking at the plots, it seems like extrinsic factors were perceived as much more important than intrinsic factors for cognition and control, a bit more important than intrinsic factors for social connection and positive emotions, roughly equally important to intrinsic factors for negative emotions, and less important than intrinsic factors for bodily sensations. These interaction terms just confirm that the difference between “extrinsic” and “intrinsic” varied significantly across domains.)

Table: Answers to (optional) free-response question about other developmental factors

d_dev_factor_other %>%
  mutate(domain = recode_factor(
    domain,
    "BOD" = "Bodily sensations",
    "NEG" = "Negative emotions",
    "POS" = "Social abilities & positive emotions",
    "COG" = "Cognition & control",
    .default = NA_character_),
    capacity = gsub("_", " ", capacity)) %>%
  filter(response != "idk") %>%
  distinct(domain, capacity, response) %>%
  arrange(domain, capacity, response) %>%
  kable(caption = "Free responses to optional question about other developmental factors that might play a role (excluding answers like 'N/A,' 'no,' 'not that I can think of', etc.)") %>%
  kable_styling() %>%
  collapse_rows(1:2)
Free responses to optional question about other developmental factors that might play a role (excluding answers like 'N/A,' 'no,' 'not that I can think of', etc.)
domain capacity response
Bodily sensations feeling pain Again, you're born with this ability
all children develop differently so i rate as ive experienced
I believe that most living things can feel pain
I think experiencing physical pain is possibly as soon as a brain develops, long before birth
I think feeling pain is innate
I think pain is one of the first sensations that humans are able to actually comprehend
It is just a natural sensation. Our body is programmed to feel bad to avoid further injury or notifiy us that one has occured
Nervous system
None come to mind
Not that I can think of. I think everyone is capable of feeling pain, even at birth, as it is something physical. Whether they understand why they feel it though is a different story
Not that I know of
Pain is likely the very first thing we all experience when we are born. Childbirth is not exactly pleasant for the mother or the baby
Social interaction
The pain response is pre-programmed but, I feel it may take a couple of days at least for it to recognize it is pain and what to do about it (ex. they need to cry to let us know)
This is another one I would use the word "primal" to describe
Watching other's reaction to painful situations
Whether or not they could ignore it or recall feeling pain before and cope
getting hungry All children are capable of being hungry
Biological Need
child is controlling himself
everyone gets hungry no matter what the age is . it depends on how we show we are hungry
evolution, survival mechanisms
Getting hungry is one of the first things a newborn will experience
I think we're all just born with the feeling of hunger because he have to have nourishment
It's just survival at this point
It's simply built in
just something theyre born with
No, I think it's natural for all living beings to get hungry
None come to mind
the child being active and using enagy
The child has emotions that cause them to increase their desire to do this
the child just gets hungry- human nature
the more experience they have with food, the bigger the capacity for hunger
We are just preprogrammed to know when we are hungry.
Yeah, I think this one could be covered with just one answer and needs no further thought or explanation
You're born with this ability. Technically, you have this ability BEFORE you're born
Negative emotions feeling distressed again this is similar to the first one as they age they become more independent and spend less time distressed
All children can feel distressed at any given age
Babies show that they can be distressed from birth, or even during labor.
Distress is a biological survival mechanism
Distress is easily felt regardless of age. The factors change. A newborn gets distressed if they are hungry, or tired, or sick, etc. A 5 year old can get distressed if their favorite toy breaks
Feeling distressed is natural as the child has physical needs and cannot attend to them on their own
General living
I believe the feeling of distress is another innate ability that we are able to feel from the moment we're born. I think living, breathing creature that has feelings is the same way from birht
I do not imagine that any child of any age does not have this ability
I feel like feeling distressed can be attributed to human's evolution. Distress would be hard coded in the DNA (panic when something bad happens help survival)
I think babies crying shows distress
I think distress is an innate thing that's already there long before birth
I think it's similar to the pain feeling. They can feel distressed, but they may not understand the feeling
I think that feeling distressed is somewhat primal. Flight or flight, so to speak. I don't know if I would use the word "biological" to describe it, given my choice, but it's the closest out of the option provided. Then there are layers of socialization, etc. beyond that which amplify it
i think they always know distress in my opinion
if the child is left alone or isnt care for
It's an automatic response
It's the result of biological function, like pain response
Maybe hereditary?
Maybe the amount of nutrition a child gets throughout their life cycle
None come to mind
There could be physiological elements that prevent a child from being able to feel distress as acutely as other children
They are alive
They can feel stress from the people around them especially parents even inside the womb
You're born with all emotions, even if you don't understand them yet
feeling helpless Again, you're born with emotions. You might not fully comprehend them, but you have the ability to feel them, nontheless
as they age there is a tendency to become more independent and at that age less aware of danger
Feeling helpless is something that is learned through experience, not an innate ability
Feeling helplessness is not really an ability at all, it's an emotion. Most people are capable of feeling helpless
I don't think you can feel helpless until you become completely self aware, and I'm not sure when that happens
I feel like a kid would need to have some understanding of their emotions
I feel like this is something that a child knows
I feel that it changes. A younger child may not know or understand the feeling of helpless. An older child my feel they are invinsible or independent.
I really don't know what develops a child's sense to feel helpless
I think helplessness stems from a fundamental fear of losing something we've got or not getting something we want (regardless of how well we are able to articulate or understand what that is in a sophisticated way)
I think it is just mental development. Young children don't really feel self pity
I think that it all surrounds object perception/realization. Once the child realizes that "food" makes them not hungry or "moving" makes them not hurt
I think this is something that happens later in life
My zero is because at the beginning, there's no feeling of self, so you can't feel helpless if you don't feel the self (in my opinion)
None come to mind
Not being taken care of or given what it wants would eventually make them real familiar with feeling helpless
The child has negative experiences that increase this
The child notices when it is not cared for properly by feelings of hunger,pain etc
The child's need to be loved and cared for contributes to their feeling helpless, since they are generally moreso helpless in the earlier stages of life than later
The child's needs change
This is also hard to rate but I go with my same rationale for happiness. Infants ARE helpless and I think on some leel they know it
Very complicated question, as feeling helpless first requires a concept of helplessness (and in a way a name for that condition.) It might require the knowledge of help itself. So if a creature has never known help of any kind how can they know helplessness. Also there is learned helplessness which is different from experiencing the feeling of being helpless. I almost need more specific info to answer this one. But I just answered in terms of general capability
Social abilities & positive emotions feeling happy A child that feels love feels happiness
Again, I think happiness (albeit, not amusement) is something relatively innate related to security & safety. I feel like this should be an incredibly easy question to pinpoint to a specific cause, and yet somehow it is not at all
As the brain grows, we are capable of sensating new emotions.
Brain development in general plays a key role, as the child gets older, the brain is able to comprehend emotion
Children can feel joy at a certain age
I suppose in a way opportunities or reasons to be happy play a role in the development of capacity for happiness
I think it's innate in children..Sometimes they interpret it differently as they get older though
I think its just within them to feel happy
I think the ability to know they are happy also goes along with brain development
it is a normal emotion
None come to mind
Other external stimuli encourages this
social environment
The child becomes more able to notice their own feelings
the child senses the love shared around him\her
The child's interests/needs change
This is a harder one for me to rate. I would say some form of emotional range is present at birth. It would have to be. Beyond that I do not know
Well fed or not
yes it depends if the child is in a good home or a bad home
You're born with this ability
learning from other people after the age of 2 or 3 the ability to learn langauges begins to diminish hence my ratings after that age
Children have the capacity to learn from people at a certain age
I feel like this is just the nature of human beings to learn from the others around (we wouldn't be where we are without it)
I think there are a ton of factors that lend to learning. I think it was one of the major purposes of the brain and so many, many parts of the brain and body contribute to it
kids love to copy people they are around and that how they learn
Learning is an innate ability. Generally, everyone is born with the ability to learn
None come to mind
Relationship with parents
The amount of nutrition the child gets throughout their life cycle
The more they age, the more connections the brain makes.
Cognition & control controlling their emotions A 0 to 9 month old infant is never wrong. You don't tell a 0 to 9 month old infant "No" or "Not right now". After 9 months, then you can start having that conversation
Children can learn to control their emotions after a certain age
Children imitate other children
Environmental influences
having very good role models and a good home to learn these in
I don't really think there is anything else. It is taught and seen
I don't think anyone can control thier emotions (make yourself sad, NOW!), only the expression of them
I know a lot of adults that can't control their emotions. This is something you either have or don't have,
I would say the type of parenting being done by the parents
I'm afraid I don't have much to add here. Most of your questions covered it. I would say their environment, but that was, more or less, covered in the questions
Learning from adults reaction to behavior
Learning that outcomes can change depending on the the emotion they display
Maybe an innate connection with being, life, presence, consciousness (that thing which can't quite be named.)
None come to mind
overall social environment
The child has life experiences after birth that increase their ability to do this
They aren't necessarily learning to control the emotion so much as the expression
They brains haven't fully developed they cab;'t help themselves and are still exploring their emotions
They react to positive or negative responses from other humans, if they control, or don't control their emotions
watching tv or movies
reasoning about things Again, up to about 9 months old the wiring is just not there. It beginbs to develop but... to be honest reasoning is something many adults fail at
Genetic driven intelligence ability
injury/disability
It's mostly just natural mental development
Maybe the amount of food/nutrition they get throughout their life cycle
No not that I'm aware of
None come to mind
not sure if they can have those skills
Nuerological development can impact this..for example if they develop brain injuries...autism etc
Reasoning I feel is something they learn as the brain develops
The more they age, the more they comprehend and understand.
watching tv or videos

Plots: Most important developmental factor, by domain and capacity

ggplot(d_dev_factor_most_important_choice %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate(dev_factor = case_when(
           grepl("Other", response) ~ "other",
           grepl("teach", response) ~ "people teach",
           grepl("experiments", response) ~ "experiments",
           grepl("womb", response) ~ "womb experiences",
           grepl("interacts", response) ~ "interacts people",
           grepl("preprogrammed", response) ~ "preprogrammed",
           grepl("objects", response) ~ "observes objects",
           grepl("observes the people", response) ~ "observes people",
           grepl("body grows", response) ~ "body grows",
           grepl("brain changes", response) ~ "brain changes",
           grepl("senses improve", response) ~ "senses improve"),
           dev_factor = factor(
             dev_factor,
             levels = c(gsub("_", " ", 
                             levels(d_dev_factor_rating$dev_factor)),
                        "other"))) %>%
         mutate_at(vars(capacity, response),
                   funs(gsub("_", " ", .))),
       aes(x = dev_factor, fill = domain)) +
  facet_wrap(~ domain ~ capacity, ncol = 4) +
  theme(legend.position = "none",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  geom_bar() +
  labs(title = "Choice of most important developmental factor (Version 1)",
       x = "Developmental factor", 
       y = "Number of participants")

d_dev_factor_most_important_choice_other <- d_dev_factor_most_important_choice %>% 
  filter(grepl("Other", response)) %>% 
  count(domain, capacity)
ggplot(d_dev_factor_most_important_choice %>%
         mutate(domain = recode_factor(
           domain,
           "BOD" = "Bodily sensations",
           "NEG" = "Negative emotions",
           "POS" = "Social abilities & positive emotions",
           "COG" = "Cognition & control",
           .default = NA_character_)) %>%
         mutate(dev_factor = case_when(
           grepl("Other", response) ~ "other",
           grepl("teach", response) ~ "people teach",
           grepl("experiments", response) ~ "experiments",
           grepl("womb", response) ~ "womb experiences",
           grepl("interacts", response) ~ "interacts people",
           grepl("preprogrammed", response) ~ "preprogrammed",
           grepl("objects", response) ~ "observes objects",
           grepl("observes the people", response) ~ "observes people",
           grepl("body grows", response) ~ "body grows",
           grepl("brain changes", response) ~ "brain changes",
           grepl("senses improve", response) ~ "senses improve"),
           dev_factor = factor(
             dev_factor,
             levels = c(gsub("_", " ", 
                             levels(d_dev_factor_rating$dev_factor)),
                        "other"))) %>%
         mutate_at(vars(capacity, response),
                   funs(gsub("_", " ", .))) %>%
         filter(dev_factor != "other"),
       aes(x = reorder(capacity, as.numeric(domain)), fill = domain)) +
  facet_wrap(~ dev_factor, ncol = 5) +
  theme(legend.position = "top",
        axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  geom_bar() +
  labs(title = "Choice of most important developmental factor (Version 2)",
       subtitle = paste0("Excluding answers of 'other' (n < ", 
                         max(d_dev_factor_most_important_choice_other$n) + 1, ") for any capacity"),
       color = "Domain",
       x = "Capacity (by domain)", 
       y = "Number of participants")

d_dev_factor_most_important_free %>%
  mutate(domain = recode_factor(
    domain,
    "BOD" = "Bodily sensations",
    "NEG" = "Negative emotions",
    "POS" = "Social abilities & positive emotions",
    "COG" = "Cognition & control",
    .default = NA_character_),
    capacity = gsub("_", " ", capacity)) %>%
  distinct(domain, capacity, response) %>%
  arrange(domain, capacity, response) %>%
  kable(caption = "Free responses when 'other' was selected as most important developmental factor") %>%
  kable_styling() %>%
  collapse_rows(1:2)
Free responses when 'other' was selected as most important developmental factor
domain capacity response
Bodily sensations feeling pain everyone is capable of feeling pain.
getting hungry All children are capable of being hungry.
Negative emotions feeling distressed As soon as his consious develops they are considered alive and capable of feeling.
emotional development
most id not all children are capable of experinceing distress not matter what.
feeling helpless Experiences in life
I really don't know.
Not sure helplessness is felt so young
Social abilities & positive emotions feeling happy Every child is capable of feeling happiness no matter what.
it is just a normal response too something enjoyed
learning from other people not sure
Cognition & control controlling their emotions impossibe

Relationships between developmental factor ratings and capacity ratings

temp <- d_cap_rating %>%
  rename(response_cap_rating = response) %>%
  full_join(d_dev_factor_rating_byclust %>%
              rename(response_dev_factor = response))
Joining, by = c("ResponseId", "domain", "capacity")
ggplot(temp %>% filter(target == "target00mo"),
       aes(x = response_dev_factor, y = response_cap_rating, 
           color = domain, group = capacity)) +
  facet_grid(cols = vars(domain, capacity), 
             rows = vars(dev_factor_cluster, dev_factor)) +
  geom_jitter(alpha = 0.2) +
  geom_smooth(color = "black", method = "lm") +
  theme(legend.position = "none") +
  labs(title = "Relationship between endorsement of extrinsic vs. intrinsic developmental factors and attributions of capaciites at birth",
       x = "Endorsement of developmental factor",
       y = "Capacity attriubtion")

ggplot(temp,
       aes(x = response_dev_factor, y = response_cap_rating)) +
  facet_grid(dev_factor_cluster ~ target_ord) +
  geom_jitter(alpha = 0.01, color = "gray") +
  geom_smooth(aes(color = dev_factor, fill = dev_factor), method = "lm") +
  scale_color_brewer(palette = "Paired") +
  scale_fill_brewer(palette = "Paired") +
  theme(legend.position = "bottom") +
  labs(title = "Relationship between endorsement of extrinsic vs. intrinsic developmental factors and attributions of capacities at various target ages",
       x = "Endorsement of developmental factor",
       y = "Capacity attriubtion")

ggplot(temp %>% filter(domain == "BOD"),
       aes(x = response_dev_factor, y = response_cap_rating)) +
  facet_grid(rows = vars(capacity, dev_factor_cluster),
             cols = vars(target_ord)) +
  geom_jitter(alpha = 0.04, color = "gray") +
  geom_smooth(aes(color = dev_factor, fill = dev_factor), method = "lm") +
  scale_color_brewer(palette = "Paired") +
  scale_fill_brewer(palette = "Paired") +
  theme(legend.position = "bottom") +
  labs(title = "BODILY SENSATIONS: Relationship between endorsement of extrinsic vs. intrinsic developmental factors and attributions of capacities at various target ages",
       x = "Endorsement of developmental factor",
       y = "Capacity attriubtion")

ggplot(temp %>% filter(domain == "NEG"),
       aes(x = response_dev_factor, y = response_cap_rating)) +
  facet_grid(rows = vars(capacity, dev_factor_cluster),
             cols = vars(target_ord)) +
  geom_jitter(alpha = 0.04, color = "gray") +
  geom_smooth(aes(color = dev_factor, fill = dev_factor), method = "lm") +
  scale_color_brewer(palette = "Paired") +
  scale_fill_brewer(palette = "Paired") +
  theme(legend.position = "bottom") +
  labs(title = "NEGATIVE EMOTIONS: Relationship between endorsement of extrinsic vs. intrinsic developmental factors and attributions of capacities at various target ages",
       x = "Endorsement of developmental factor",
       y = "Capacity attriubtion")

ggplot(temp %>% filter(domain == "POS"),
       aes(x = response_dev_factor, y = response_cap_rating)) +
  facet_grid(rows = vars(capacity, dev_factor_cluster),
             cols = vars(target_ord)) +
  geom_jitter(alpha = 0.04, color = "gray") +
  geom_smooth(aes(color = dev_factor, fill = dev_factor), method = "lm") +
  scale_color_brewer(palette = "Paired") +
  scale_fill_brewer(palette = "Paired") +
  theme(legend.position = "bottom") +
  labs(title = "POSITIVE EMOTIONS & SOCIAL ABILITIES: Relationship between endorsement of extrinsic vs. intrinsic developmental factors and attributions of capacities at various target ages",
       x = "Endorsement of developmental factor",
       y = "Capacity attriubtion")

ggplot(temp %>% filter(domain == "COG"),
       aes(x = response_dev_factor, y = response_cap_rating)) +
  facet_grid(rows = vars(capacity, dev_factor_cluster),
             cols = vars(target_ord)) +
  geom_jitter(alpha = 0.04, color = "gray") +
  geom_smooth(aes(color = dev_factor, fill = dev_factor), method = "lm") +
  scale_color_brewer(palette = "Paired") +
  scale_fill_brewer(palette = "Paired") +
  theme(legend.position = "bottom") +
  labs(title = "COGNITION & CONTROL: Relationship between endorsement of extrinsic vs. intrinsic developmental factors and attributions of capacities at various target ages",
       x = "Endorsement of developmental factor",
       y = "Capacity attriubtion")

Demographics

ggplot(d_demo, aes(x = Duration/60)) + 
  geom_histogram(binwidth = 2) +
  geom_vline(xintercept = median(d_demo$Duration/60), color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 4)) +
  labs(title = "Duration of study (according to Qualtrics)",
       subtitle = "Blue dotted line marks median",
       x = "Duration (in minutes)",
       y = "Number of participants")

ggplot(d_demo, aes(x = Age)) + 
  geom_histogram(binwidth = 2) +
  geom_vline(xintercept = median(d_demo$Age), color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 4)) +
  labs(title = "Particpiant age (self-reported)",
       subtitle = "Blue dotted line marks median",
       x = "Age (in years)",
       y = "Number of participants")

ggplot(d_demo, aes(x = GenderSex)) + 
  geom_bar() +
  labs(title = "Particpiant gender/sex (self-reported)",
       x = "Gender/sex",
       y = "Number of participants")

ggplot(d_demo, aes(x = gsub('(.{1,30})(\\s|$)', '\\1\n', RaceEthnicity_collapse))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant race/ethnicity (self-reported)",
       x = "Race/ethnicity",
       y = "Number of participants")

ggplot(d_demo, aes(x = FirstLang)) + 
  geom_bar() +
  labs(title = "Particpiant first language (self-reported)",
       x = "Language",
       y = "Number of participants")

ggplot(d_demo, aes(x = factor(Education,
                              levels = levels(d$Education),
                              labels = gsub('(.{1,30})(\\s|$)', '\\1\n', 
                                            levels(d$Education))))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant educational attainment (self-reported)",
       x = "Highest level of education completed",
       y = "Number of participants")

ggplot(d_demo, aes(x = Income)) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant household income (self-reported)",
       x = "Annual household income",
       y = "Number of participants")

ggplot(d_demo, aes(x = HouseholdSize)) + 
  geom_histogram(binwidth = 1) +
  geom_vline(xintercept = median(d_demo$HouseholdSize), color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 1)) +
  labs(title = "Particpiant household size (self-reported)",
       subtitle = "Blue dotted line marks median",
       x = "Number of people in household (adults and children)",
       y = "Number of participants")

ggplot(d_demo, aes(x = MaritalStatus)) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant marital status (self-reported)",
       x = "Marital status",
       y = "Number of participants")

ggplot(d_demo, aes(x = Parent)) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Particpiant parent status (self-reported)",
       subtitle = "'NA' indicates response of 'Prefer not to say'",
       x = "Parent status",
       y = "Number of participants")

ggplot(d_demo %>% filter(Parent == "Yes"), aes(x = ChildrenNumber)) + 
  geom_histogram(binwidth = 1) +
  geom_vline(xintercept = median(d_demo[d_demo$Parent == "Yes",]$ChildrenNumber, na.rm = T), 
             color = "blue", lty = 2) +
  scale_x_continuous(breaks = seq(0, 10000, 1)) +
  labs(title = "Number of children among parents (self-reported)",
       subtitle = "Blue dotted line marks median",
       x = "Number of children (among parents)",
       y = "Number of participants")

ggplot(d_demo %>% filter(Parent == "Yes"), 
       aes(x = factor(ChildrenYoungestAge_collapse,
                      levels = levels(d_demo$ChildrenYoungestAge_collapse),
                      labels = gsub('(.{1,30})(\\s|$)', '\\1\n', 
                                    levels(d_demo$ChildrenYoungestAge_collapse))))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Age of youngest child among parents (self-reported)",
       x = "Age of child",
       y = "Number of participants")

ggplot(d_demo %>% filter(Parent == "Yes"), 
       aes(x = factor(ChildrenOldestAge_collapse,
                      levels = levels(d_demo$ChildrenOldestAge_collapse),
                      labels = gsub('(.{1,30})(\\s|$)', '\\1\n', 
                                    levels(d_demo$ChildrenOldestAge_collapse))))) + 
  geom_bar() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
  labs(title = "Age of oldest child among parents (self-reported)",
       x = "Age of child",
       y = "Number of participants")

LS0tCnRpdGxlOiAiQmFieSBNZW50YWwgTGlmZTogU3R1ZHkgMyIKc3VidGl0bGU6ICJQcmVyZWdpc3RlcmVkIGFuYWx5c2VzIgpkYXRlOiAyMDE4LTA1LTA3Cm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKYGBge3J9CiMgbG9hZCByZXF1aXJlZCBsaWJyYXJpZXMKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobGFuZ2NvZykgIyBzb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9sYW5nY29nL2xhbmdjb2ctcGFja2FnZQpsaWJyYXJ5KHBzeWNoKQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShnZ2RlbmRybykKbGlicmFyeShkZW5kZXh0ZW5kKQoKIyBzZXQgdGhlbWUgZm9yIGdncGxvdHMKdGhlbWVfc2V0KHRoZW1lX2J3KCkpCgpjaG9zZW5fcm90IDwtICJvYmxpbWluIgpgYGAKCmBgYHtyfQojIHJ1biBzb3VyY2UgY29kZSAoZXh0cmEgaG9tZS1tYWRlIGZ1bmN0aW9ucykKc291cmNlKCIuL3NjcmlwdHMvbWF4X2ZhY3RvcnNfZWZhLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9wbG90X2Z1bi5SIikKc291cmNlKCIuL3NjcmlwdHMvcmV0ZW5fZnVuLlIiKQpzb3VyY2UoIi4vc2NyaXB0cy9kYXRhX3ByZXAuUiIpCmBgYAoKIkJhYnkgTWVudGFsIExpZmU6IFN0dWR5IDMiIHdhcyBjb25kdWN0ZWQgb24gTVR1cmsgb24gMjAxOS0wNC0yNC4KCk91ciBwbGFubmVkIHNhbXBsZSB3YXMgMzAwIHBhcnRpY2lwYW50czsgYmFzZWQgb24gU3R1ZHkgMiwgd2UgaW5pdGlhbGx5IHJlY3J1aXRlZCAzNTIgcGFydGljaXBhbnRzLiBBZnRlciBmaWx0ZXJpbmcgb3V0IHBhcnRpY2lwYW50cyB3aG8gZmFpbGVkIGF0IGxlYXN0IG9uZSBvZiBvdXIgYXR0ZW50aW9uIGNoZWNrcywgd2UgZW5kZWQgdXAgcmV0YWluaW5nIDI3OSBwYXJ0aWNpcGFudHMgKHJldGVudGlvbiByYXRlOiBgciByb3VuZChucm93KGQpLzM1MiwgMykqMTAwYCUpLiBXZSB0aGVuIHN1cHBsZW1lbnRlZCBieSByZWNydWl0aW5nIGFuIGFkZGl0aW9uYWwgMjggcGFydGljaXBhbnRzLCB3aXRoIHRoZSBnb2FsIG9mIGF0dGFpbmluZyBvdXIgcGxhbm5lZCBzYW1wbGUgKDMwMCAtIDI3OSA9IDIxIHBhcnRpY2lwYW50cywgMjc5LzM1MiAqIDI4ID0gMjIpLiBBdCBlYWNoIHN0YWdlLCB3ZSByZWNydWl0ZWQgd29tZW4gYW5kIG1lbiB0aHJvdWdoIHNlcGFyYXRlIHN0dWRpZXMsIGluIGhvcGVzIG9mIGFjcXVpcmluZyBhIHJvdWdobHkgZXF1YWwgc3BsaXQgYmV0d2VlbiBnZW5kZXJzLgoKSW4gdGhlIGVuZCwgd2UgZW5kZWQgdXAgd2l0aCBhIHNhbXBsZSBvZiBgciBucm93KGQpYCBwYXJ0aWNpcGFudHMgd2hvIHBhc3NlZCBvdXIgYXR0ZW50aW9uIGNoZWNrcywgYHIgbnJvdyhkX25vZHVwKWAgb2Ygd2hvbSBjYW1lIGZyb20gdW5pcXVlIEdQUyBjb29yZGluYXRlcyAoYHIgcm91bmQobnJvdyhkX25vZHVwKS9ucm93KGQpLCAzKSoxMDBgJSkuCgoqKkZvciB0aGlzIGZpcnN0IHBhc3MsIHRoZXNlIGRhdGEgX2luY2x1ZGVfIHBhcnRpY2lwYW50cyB3aGVyZSB0aGVyZSBpcyBhbm90aGVyIHBhcnRpY2lwYW50IHdpdGggYW4gaWRlbnRpY2FsIHNldCBvZiBHUFMgY29vcmRpbmF0ZXMgYXMgcmVjb3JkZWQgYnkgUXVhbHRyaWNzLioqCgpFYWNoIHBhcnRpY2lwYW50IGFzc2Vzc2VkIGNoaWxkcmVuJ3MgbWVudGFsIGNhcGFjaXRpZXMgYXQgMTMgdGFyZ2V0IGFnZXMgYmV0d2VlbiB0aGUgYWdlcyBvZiAwIGFuZCA1IHllYXJzLiBGb3IgZWFjaCB0YXJnZXQsIHRoZXkgcmF0ZWQgOCBtZW50YWwgY2FwYWNpdGllcyBvbiBhIHNjYWxlIGZyb20gMCAobm90IGF0IGFsbCBjYXBhYmxlKSB0byAxMDAgKGNvbXBsZXRlbHkgY2FwYWJsZSkuIEluIGNvbnRyYXN0IHRvIFN0dWR5IDIsIHBhcnRpY2lwYW50cyBjb21wbGV0ZWQgYWxsIDEzIHJhdGluZ3Mgb2YgYSBwYXJ0aWN1bGFyIG1lbnRhbCBjYXBhY2l0eSBvbiBhIHNpbmdsZSAidHJpYWwiIChyYXRoZXIgdGhhbiBjb21wbGV0aW5nIGFsbCA4IHJhdGluZ3Mgb2YgYSBwYXJ0aWN1bGFyIHRhcmdldCBhZ2Ugb24gYSBzaW5nbGUgdHJpYWwpLiBJbiBhZGRpdGlvbiwgcGFydGljaXBhbnRzIGFuc3dlcmVkIHF1ZXN0aW9ucyBhYm91dCB0aGUgImRldmVsb3BtZW50YWwgZmFjdG9ycyIgdGhhdCBtaWdodCBjb250cmlidXRlIHRvIGRldmVsb3BtZW50IGluIHRoaXMgZG9tYWluLgoKRm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgc3R1ZHksIHNlZSBvdXIgcHJlcmVnaXN0cmF0aW9uIFtoZXJlXShodHRwczovL29zZi5pby94aDhjZSkuIAoKIyBTdHVkeSAxIEVGQQoKYGBge3J9CiMgbG9hZCBpbiBFRkEgcmVzdWx0cyBmcm9tIHN0dWR5IDEKZWZhX1MxIDwtIHJlYWRSRFMoIi4uL3N0dWR5IDEvczFfZWZhLnJkcyIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAxLjV9CmhlYXRtYXBfZnVuKGVmYV9TMSkgKyAKICBsYWJzKHRpdGxlID0gcGFzdGUwKCJTVFVEWSAxIFBhcmFsbGVsIEFuYWx5c2lzIChyb3RhdGlvbjogIiwgY2hvc2VuX3JvdCwgIikiKSwKICAgICAgIHN1YnRpdGxlID0gIiclIHZhci4nIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIHNoYXJlZCB2YXJpYW5jZSBleHBsYWluZWQgKHRvdGFsID0gMTAwJSkiKQpgYGAKCiMgUGxvdHM6IENhcGFjaXR5IHJhdGluZ3MgYXMgYSBmdW5jdGlvbiBvZiB0YXJnZXQgYWdlIGFuZCBkb21haW4KCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpnZ3Bsb3QoZF9jYXBfcmF0aW5nICU+JQogICAgICAgICBhcnJhbmdlKFJlc3BvbnNlSWQsIGRvbWFpbiwgY2FwYWNpdHksIHRhcmdldF9vcmQpICU+JQogICAgICAgICBtdXRhdGUoZG9tYWluID0gcmVjb2RlX2ZhY3RvcigKICAgICAgICAgICBkb21haW4sCiAgICAgICAgICAgIkJPRCIgPSAiQm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICJORUciID0gIk5lZ2F0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiUE9TIiA9ICJTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJDT0ciID0gIkNvZ25pdGlvbiAmIGNvbnRyb2wiLAogICAgICAgICAgIC5kZWZhdWx0ID0gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgICAgY2FwYWNpdHkgPSBnc3ViKCJfIiwgIiAiLCBjYXBhY2l0eSkpLAogICAgICAgYWVzKHggPSB0YXJnZXRfbnVtLCB5ID0gcmVzcG9uc2UsIGdyb3VwID0gUmVzcG9uc2VJZCwKICAgICAgICAgICBjb2xvciA9IGRvbWFpbikpICsKICBmYWNldF93cmFwKH4gZG9tYWluIH4gY2FwYWNpdHksIG5jb2wgPSA0KSArCiAgZ2VvbV9wYXRoKGFscGhhID0gMC4xKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGdyb3VwID0gY2FwYWNpdHkpLCAKICAgICAgICAgICAgICBtZXRob2QgPSAibG9lc3MiLCAKICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gYXMubnVtZXJpYyhsZXZlbHMoZmFjdG9yKGRfY2FwX3JhdGluZyR0YXJnZXRfbnVtKSkpLAogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBsZXZlbHMoZF9jYXBfcmF0aW5nJHRhcmdldF9vcmQpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUGVyY2VwdGlvbnMgb2YgZGV2ZWxvcG1lbnQsIGJ5IGRvbWFpbiIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbGFjayBsaW5lID0gbG9lc3Mgc21vb3RoaW5nIiwKICAgICAgIHggPSAiVGFyZ2V0IGFnZSAobnVtZXJpYykiLAogICAgICAgeSA9ICJSZXNwb25zZSAoMCA9IG5vdCBhdCBhbGwgY2FwYWJsZSwgMTAwID0gY29tcGxldGVseSBjYXBhYmxlKSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjd9CmdncGxvdChkX2NhcF9yYXRpbmcgJT4lCiAgICAgICAgIGFycmFuZ2UoUmVzcG9uc2VJZCwgZG9tYWluLCBjYXBhY2l0eSwgdGFyZ2V0X29yZCkgJT4lCiAgICAgICAgIG11dGF0ZShkb21haW4gPSByZWNvZGVfZmFjdG9yKAogICAgICAgICAgIGRvbWFpbiwKICAgICAgICAgICAiQk9EIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAgICAgICAgIk5FRyIgPSAiTmVnYXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJQT1MiID0gIlNvY2lhbCBhYmlsaXRpZXMgJiBwb3NpdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIkNPRyIgPSAiQ29nbml0aW9uICYgY29udHJvbCIsCiAgICAgICAgICAgLmRlZmF1bHQgPSBOQV9jaGFyYWN0ZXJfKSwKICAgICAgICAgICBjYXBhY2l0eSA9IGdzdWIoIl8iLCAiICIsIGNhcGFjaXR5KSksCiAgICAgICBhZXMoeCA9IHNxcnQodGFyZ2V0X251bSksIHkgPSByZXNwb25zZSwgZ3JvdXAgPSBSZXNwb25zZUlkLAogICAgICAgICAgIGNvbG9yID0gZG9tYWluKSkgKwogIGZhY2V0X3dyYXAofiBkb21haW4gfiBjYXBhY2l0eSwgbmNvbCA9IDQpICsKICBnZW9tX3BhdGgoYWxwaGEgPSAwLjEpICsKICBnZW9tX3Ntb290aChhZXMoZ3JvdXAgPSBjYXBhY2l0eSksIAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsb2VzcyIsIAogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzcXJ0KGFzLm51bWVyaWMobGV2ZWxzKGZhY3RvcihkX2NhcF9yYXRpbmckdGFyZ2V0X251bSkpKSksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGxldmVscyhkX2NhcF9yYXRpbmckdGFyZ2V0X29yZCkpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQZXJjZXB0aW9ucyBvZiBkZXZlbG9wbWVudCwgYnkgZG9tYWluIiwKICAgICAgIHN1YnRpdGxlID0gIkJsYWNrIGxpbmUgPSBsb2VzcyBzbW9vdGhpbmciLAogICAgICAgeCA9ICJUYXJnZXQgYWdlIChudW1lcmljLCBzcXVhcmUtcm9vdCB0cmFuc2Zvcm1lZCkiLAogICAgICAgeSA9ICJSZXNwb25zZSAoMCA9IG5vdCBhdCBhbGwgY2FwYWJsZSwgMTAwID0gY29tcGxldGVseSBjYXBhYmxlKSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjd9CmdncGxvdChkX2NhcF9yYXRpbmcgJT4lCiAgICAgICAgIGFycmFuZ2UoUmVzcG9uc2VJZCwgZG9tYWluLCBjYXBhY2l0eSwgdGFyZ2V0X29yZCkgJT4lCiAgICAgICAgIG11dGF0ZShkb21haW4gPSByZWNvZGVfZmFjdG9yKAogICAgICAgICAgIGRvbWFpbiwKICAgICAgICAgICAiQk9EIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAgICAgICAgIk5FRyIgPSAiTmVnYXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJQT1MiID0gIlNvY2lhbCBhYmlsaXRpZXMgJiBwb3NpdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIkNPRyIgPSAiQ29nbml0aW9uICYgY29udHJvbCIsCiAgICAgICAgICAgLmRlZmF1bHQgPSBOQV9jaGFyYWN0ZXJfKSwKICAgICAgICAgICBjYXBhY2l0eSA9IGdzdWIoIl8iLCAiICIsIGNhcGFjaXR5KSksCiAgICAgICBhZXMoeCA9IHRhcmdldF9vcmQsIHkgPSByZXNwb25zZSwgZ3JvdXAgPSBSZXNwb25zZUlkLAogICAgICAgICAgIGNvbG9yID0gZG9tYWluKSkgKwogIGZhY2V0X3dyYXAofiBkb21haW4gfiBjYXBhY2l0eSwgbmNvbCA9IDQpICsKICBnZW9tX3BhdGgoYWxwaGEgPSAwLjEpICsKICBnZW9tX3Ntb290aChhZXMoZ3JvdXAgPSBjYXBhY2l0eSksIAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsb2VzcyIsIAogICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBlcmNlcHRpb25zIG9mIGRldmVsb3BtZW50LCBieSBkb21haW4iLAogICAgICAgc3VidGl0bGUgPSAiQmxhY2sgbGluZSA9IGxvZXNzIHNtb290aGluZyIsCiAgICAgICB4ID0gIlRhcmdldCBhZ2UgKG9yZGluYWwpIiwKICAgICAgIHkgPSAiUmVzcG9uc2UgKDAgPSBub3QgYXQgYWxsIGNhcGFibGUsIDEwMCA9IGNvbXBsZXRlbHkgY2FwYWJsZSkiKQpgYGAKCgojIFJlZ3Jlc3Npb24gbW9kZWxzLCB2ZXJzaW9uIDE6IENhcGFjaXR5IHJhdGluZ3MgYXMgYSBmdW5jdGlvbiBvZiB0YXJnZXQgYWdlIGFuZCBkb21haW4KCmBgYHtyfQpjb250cmFzdHNfZG9tYWluX2VmZl9ub0NPRyA8LSBjYmluZChCT0QgPSBjKDEsIC0xLCAwLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVHID0gYygwLCAtMSwgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBPUyA9IGMoMCwgLTEsIDAsIDEpKQpjb250cmFzdHNfZG9tYWluX2VmZl9ub1BPUyA8LSBjYmluZChCT0QgPSBjKDEsIDAsIDAsIC0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVHID0gYygwLCAwLCAxLCAtMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRyA9IGMoMCwgMSwgMCwgLTEpKQpjb250cmFzdHNfZG9tYWluX2VmZl9ub05FRyA8LSBjYmluZChCT0QgPSBjKDEsIDAsIC0xLCAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUE9TID0gYygwLCAwLCAtMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRyA9IGMoMCwgMSwgLTEsIDApKQpjb250cmFzdHNfZG9tYWluX2VmZl9ub0JPRCA8LSBjYmluZChQT1MgPSBjKC0xLCAwLCAwLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVHID0gYygtMSwgMCwgMSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPRyA9IGMoLTEsIDEsIDAsIDApKQpgYGAKCiMjIFRhcmdldCBhZ2UgaW4gbW9udGhzCgojIyMgRWZmZWN0LWNvZGVkIChjb21wYXJpbmcgYWxsIGRvbWFpbnMgdG8gdGhlIGdyYW5kIG1lYW4sIGV4Y2VwdCAiYm9kaWx5IHNlbnNhdGlvbnMiKQoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7cn0KIyByMV9ub0JPRCA8LSBsbWVyKHJlc3BvbnNlIH4gdGFyZ2V0X251bSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub0JPRCkpCiMgc2F2ZVJEUyhyMV9ub0JPRCwgIi4vbW9kZWxzL3IxX25vQk9ELlJEUyIpCgpyMV9ub0JPRCA8LSByZWFkUkRTKCIuL21vZGVscy9yMV9ub0JPRC5SRFMiKQpzdW1tYXJ5KHIxX25vQk9ELCBjb3JyID0gRikKYGBgCgojIyMjIE5vbi1saW5lYXIgZWZmZWN0cwoKYGBge3J9CiMgcjJfbm9CT0QgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkodGFyZ2V0X251bSwgMykgKiBkb21haW4KIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSwKIyAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9CT0QpKQojIHNhdmVSRFMocjJfbm9CT0QsICIuL21vZGVscy9yMl9ub0JPRC5SRFMiKQoKcjJfbm9CT0QgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjJfbm9CT0QuUkRTIikKc3VtbWFyeShyMl9ub0JPRCwgY29yciA9IEYpCmBgYAoKIyMjIEVmZmVjdC1jb2RlZCAoY29tcGFyaW5nIGFsbCBkb21haW5zIHRvIHRoZSBncmFuZCBtZWFuLCBleGNlcHQgIm5lZ2F0aXZlIGVtb3Rpb25zIikKCiMjIyMgTGluZWFyIGVmZmVjdHMgb25seQoKYGBge3J9CiMgcjFfbm9ORUcgPC0gbG1lcihyZXNwb25zZSB+IHRhcmdldF9udW0gKiBkb21haW4KIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSwKIyAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9ORUcpKQojIHNhdmVSRFMocjFfbm9ORUcsICIuL21vZGVscy9yMV9ub05FRy5SRFMiKQoKcjFfbm9ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjFfbm9ORUcuUkRTIikKc3VtbWFyeShyMV9ub05FRywgY29yciA9IEYpCmBgYAoKIyMjIyBOb24tbGluZWFyIGVmZmVjdHMKCmBgYHtyfQojIHIyX25vTkVHIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHRhcmdldF9udW0sIDMpICogZG9tYWluCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtICsgZG9tYWluIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMiksCiMgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGRvbWFpbiA9IGNvbnRyYXN0c19kb21haW5fZWZmX25vTkVHKSkKIyBzYXZlUkRTKHIyX25vTkVHLCAiLi9tb2RlbHMvcjJfbm9ORUcuUkRTIikKCnIyX25vTkVHIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3IyX25vTkVHLlJEUyIpCnN1bW1hcnkocjJfbm9ORUcsIGNvcnIgPSBGKQpgYGAKCiMjIyBFZmZlY3QtY29kZWQgKGNvbXBhcmluZyBhbGwgZG9tYWlucyB0byB0aGUgZ3JhbmQgbWVhbiwgZXhjZXB0ICJzb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMiKQoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7cn0KIyByMV9ub1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gdGFyZ2V0X251bSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub1BPUykpCiMgc2F2ZVJEUyhyMV9ub1BPUywgIi4vbW9kZWxzL3IxX25vUE9TLlJEUyIpCgpyMV9ub1BPUyA8LSByZWFkUkRTKCIuL21vZGVscy9yMV9ub1BPUy5SRFMiKQpzdW1tYXJ5KHIxX25vUE9TLCBjb3JyID0gRikKYGBgCgojIyMjIE5vbi1saW5lYXIgZWZmZWN0cwoKYGBge3J9CiMgcjJfbm9QT1MgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkodGFyZ2V0X251bSwgMykgKiBkb21haW4KIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSwKIyAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9QT1MpKQojIHNhdmVSRFMocjJfbm9QT1MsICIuL21vZGVscy9yMl9ub1BPUy5SRFMiKQoKcjJfbm9QT1MgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjJfbm9QT1MuUkRTIikKc3VtbWFyeShyMl9ub1BPUywgY29yciA9IEYpCmBgYAoKIyMjIEVmZmVjdC1jb2RlZCAoY29tcGFyaW5nIGFsbCBkb21haW5zIHRvIHRoZSBncmFuZCBtZWFuLCBleGNlcHQgImNvZ25pdGlvbiAmIGNvbnRyb2wiKQoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7cn0KIyByMV9ub0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gdGFyZ2V0X251bSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub0NPRykpCiMgc2F2ZVJEUyhyMV9ub0NPRywgIi4vbW9kZWxzL3IxX25vQ09HLlJEUyIpCgpyMV9ub0NPRyA8LSByZWFkUkRTKCIuL21vZGVscy9yMV9ub0NPRy5SRFMiKQpzdW1tYXJ5KHIxX25vQ09HLCBjb3JyID0gRikKYGBgCgojIyMjIE5vbi1saW5lYXIgZWZmZWN0cwoKYGBge3J9CiMgcjJfbm9DT0cgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkodGFyZ2V0X251bSwgMykgKiBkb21haW4KIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSwKIyAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9DT0cpKQojIHNhdmVSRFMocjJfbm9DT0csICIuL21vZGVscy9yMl9ub0NPRy5SRFMiKQoKcjJfbm9DT0cgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjJfbm9DT0cuUkRTIikKc3VtbWFyeShyMl9ub0NPRywgY29yciA9IEYpCmBgYAoKIyMgVGFyZ2V0IGFnZSBpbiBtb250aHMgKHNxdWFyZS1yb290IHRyYW5zZm9ybWF0aW9uKQoKKipOT1RFOiBBbGwgb2YgdGhlc2UgbW9kZWxzIGZhaWwgdG8gbWVldCBvdXIgY3JpdGVyaW9uIG9mIHJhbmRvbSBlZmZlY3RzIGJlaW5nIGNvcnJlbGF0aW9uIDwgMC45MC4qKiBCZWNhdXNlIG9mIHRoaXMsIEkgaGF2ZSBub3QgaW5jbHVkZWQgaW4gdGhpcyBwcmludC1vdXQgYW5kIEkgaGF2ZSBub3QgeWV0IG1vZGVsZWQgbm9uLWxpbmVhciBlZmZlY3RzIGFmdGVyIHNxdWFyZS1yb290IHRyYW5zZm9ybWF0aW9uLiBUaGUgbmV4dCBzdGVwIHdpbGwgYmUgdG8gdHJ5IHNpbXBsZXIgcmFuZG9tIGVmZmVjdHMgbW9kZWxzICh3aXRoIGZld2VyIHJhbmRvbSBzbG9wZXMpLgoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHIzX25vQk9EIDwtIGxtZXIocmVzcG9uc2UgfiBzcXJ0KHRhcmdldF9udW0pICogZG9tYWluCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtICsgZG9tYWluIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMiksCiMgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGRvbWFpbiA9IGNvbnRyYXN0c19kb21haW5fZWZmX25vQk9EKSkKIyBzYXZlUkRTKHIzX25vQk9ELCAiLi9tb2RlbHMvcjNfbm9CT0QuUkRTIikKCnIzX25vQk9EIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3IzX25vQk9ELlJEUyIpCnN1bW1hcnkocjNfbm9CT0QsIGNvcnIgPSBGKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyByNF9ub0JPRCA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub0JPRCkpCiMgc2F2ZVJEUyhyNF9ub0JPRCwgIi4vbW9kZWxzL3I0X25vQk9ELlJEUyIpCgpyNF9ub0JPRCA8LSByZWFkUkRTKCIuL21vZGVscy9yNF9ub0JPRC5SRFMiKQpzdW1tYXJ5KHI0X25vQk9ELCBjb3JyID0gRikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjNfbm9ORUcgPC0gbG1lcihyZXNwb25zZSB+IHNxcnQodGFyZ2V0X251bSkgKiBkb21haW4KIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSwKIyAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9ORUcpKQojIHNhdmVSRFMocjNfbm9ORUcsICIuL21vZGVscy9yM19ub05FRy5SRFMiKQoKcjNfbm9ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjNfbm9ORUcuUkRTIikKc3VtbWFyeShyM19ub05FRywgY29yciA9IEYpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI0X25vTkVHIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHNxcnQodGFyZ2V0X251bSksIDMpICogZG9tYWluCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtICsgZG9tYWluIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMiksCiMgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGRvbWFpbiA9IGNvbnRyYXN0c19kb21haW5fZWZmX25vTkVHKSkKIyBzYXZlUkRTKHI0X25vTkVHLCAiLi9tb2RlbHMvcjRfbm9ORUcuUkRTIikKCnI0X25vTkVHIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I0X25vTkVHLlJEUyIpCnN1bW1hcnkocjRfbm9ORUcsIGNvcnIgPSBGKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyByM19ub1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gc3FydCh0YXJnZXRfbnVtKSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub1BPUykpCiMgc2F2ZVJEUyhyM19ub1BPUywgIi4vbW9kZWxzL3IzX25vUE9TLlJEUyIpCgpyM19ub1BPUyA8LSByZWFkUkRTKCIuL21vZGVscy9yM19ub1BPUy5SRFMiKQpzdW1tYXJ5KHIzX25vUE9TLCBjb3JyID0gRikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjRfbm9QT1MgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkoc3FydCh0YXJnZXRfbnVtKSwgMykgKiBkb21haW4KIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gKyBkb21haW4gfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSwKIyAgICAgICAgICAgICAgICAgIGNvbnRyYXN0cyA9IGxpc3QoZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9QT1MpKQojIHNhdmVSRFMocjRfbm9QT1MsICIuL21vZGVscy9yNF9ub1BPUy5SRFMiKQoKcjRfbm9QT1MgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjRfbm9QT1MuUkRTIikKc3VtbWFyeShyNF9ub1BPUywgY29yciA9IEYpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHIzX25vQ09HIDwtIGxtZXIocmVzcG9uc2UgfiBzcXJ0KHRhcmdldF9udW0pICogZG9tYWluCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtICsgZG9tYWluIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMiksCiMgICAgICAgICAgICAgICAgICBjb250cmFzdHMgPSBsaXN0KGRvbWFpbiA9IGNvbnRyYXN0c19kb21haW5fZWZmX25vQ09HKSkKIyBzYXZlUkRTKHIzX25vQ09HLCAiLi9tb2RlbHMvcjNfbm9DT0cuUkRTIikKCnIzX25vQ09HIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3IzX25vQ09HLlJEUyIpCnN1bW1hcnkocjNfbm9DT0csIGNvcnIgPSBGKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyByNF9ub0NPRyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKSAqIGRvbWFpbgojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSArIGRvbWFpbiB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpLAojICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdChkb21haW4gPSBjb250cmFzdHNfZG9tYWluX2VmZl9ub0NPRykpCiMgc2F2ZVJEUyhyNF9ub0NPRywgIi4vbW9kZWxzL3I0X25vQ09HLlJEUyIpCgpyNF9ub0NPRyA8LSByZWFkUkRTKCIuL21vZGVscy9yNF9ub0NPRy5SRFMiKQpzdW1tYXJ5KHI0X25vQ09HLCBjb3JyID0gRikKYGBgCgoKIyBSZWdyZXNzaW9uIG1vZGVscywgdmVyc2lvbiAyOiBDYXBhY2l0eSByYXRpbmdzIGFzIGEgZnVuY3Rpb24gb2YgdGFyZ2V0IGFnZSwgZm9yIGVhY2ggZG9tYWluIHNlcGFyYXRlbHkKCioqTk9URTogQWxsIG9mIHRoZSBwcmVyZWdpc3RlcmVkIG1vZGVscyBmYWlsIHRvIG1lZXQgb3VyIGNyaXRlcmlvbiBvZiByYW5kb20gZWZmZWN0cyBiZWluZyBjb3JyZWxhdGlvbiA8IDAuOTAuKiogQmVjYXVzZSBvZiB0aGlzLCBJIGluc3RlYWQgdXNlZCBzaW1wbGVyIHJhbmRvbSBlZmZlY3RzIG1vZGVscyAod2l0aCBmZXdlciByYW5kb20gc2xvcGVzKSwgYXMgaW5kaWNhdGVkIGluIHRoZSBwcmVyZWdpc3RyYXRpb24uCgojIyBUYXJnZXQgYWdlIGluIG1vbnRocwoKIyMjIEJvZGlseSBzZW5zYXRpb25zCgojIyMjIExpbmVhciBlZmZlY3RzIG9ubHkKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyByNV9CT0QgPC0gbG1lcihyZXNwb25zZSB+IHRhcmdldF9udW0KIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiQk9EIikpCiMgc2F2ZVJEUyhyNV9CT0QsICIuL21vZGVscy9yNV9CT0QuUkRTIikKCnI1X0JPRCA8LSByZWFkUkRTKCIuL21vZGVscy9yNV9CT0QuUkRTIikKc3VtbWFyeShyNV9CT0QsIGNvcnIgPSBGKQpgYGAKCmBgYHtyfQojIHI1YV9CT0QgPC0gbG1lcihyZXNwb25zZSB+IHRhcmdldF9udW0KIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiQk9EIikpCiMgc2F2ZVJEUyhyNWFfQk9ELCAiLi9tb2RlbHMvcjVhX0JPRC5SRFMiKQoKcjVhX0JPRCA8LSByZWFkUkRTKCIuL21vZGVscy9yNWFfQk9ELlJEUyIpCnN1bW1hcnkocjVhX0JPRCwgY29yciA9IEYpCmBgYAoKIyMjIyBOb24tbGluZWFyIGVmZmVjdHMKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyByNl9CT0QgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkodGFyZ2V0X251bSwgMykKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiQk9EIikpCiMgc2F2ZVJEUyhyNl9CT0QsICIuL21vZGVscy9yNl9CT0QuUkRTIikKCnI2X0JPRCA8LSByZWFkUkRTKCIuL21vZGVscy9yNl9CT0QuUkRTIikKc3VtbWFyeShyNl9CT0QsIGNvcnIgPSBGKQpgYGAKCmBgYHtyfQojIHI2YV9CT0QgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkodGFyZ2V0X251bSwgMykKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiQk9EIikpCiMgc2F2ZVJEUyhyNmFfQk9ELCAiLi9tb2RlbHMvcjZhX0JPRC5SRFMiKQoKcjZhX0JPRCA8LSByZWFkUkRTKCIuL21vZGVscy9yNmFfQk9ELlJEUyIpCnN1bW1hcnkocjZhX0JPRCwgY29yciA9IEYpCmBgYAoKIyMjIE5lZ2F0aXZlIGVtb3Rpb25zCgojIyMjIExpbmVhciBlZmZlY3RzIG9ubHkKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyByNV9ORUcgPC0gbG1lcihyZXNwb25zZSB+IHRhcmdldF9udW0KIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiTkVHIikpCiMgc2F2ZVJEUyhyNV9ORUcsICIuL21vZGVscy9yNV9ORUcuUkRTIikKCnI1X05FRyA8LSByZWFkUkRTKCIuL21vZGVscy9yNV9ORUcuUkRTIikKc3VtbWFyeShyNV9ORUcsIGNvcnIgPSBGKQpgYGAKCmBgYHtyfQojIHI1YV9ORUcgPC0gbG1lcihyZXNwb25zZSB+IHRhcmdldF9udW0KIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiTkVHIikpCiMgc2F2ZVJEUyhyNWFfTkVHLCAiLi9tb2RlbHMvcjVhX05FRy5SRFMiKQoKcjVhX05FRyA8LSByZWFkUkRTKCIuL21vZGVscy9yNWFfTkVHLlJEUyIpCnN1bW1hcnkocjVhX05FRywgY29yciA9IEYpCmBgYAoKIyMjIyBOb24tbGluZWFyIGVmZmVjdHMKCmBgYHtyLCBpbmNsdWRlID0gRn0KIyByNl9ORUcgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkodGFyZ2V0X251bSwgMykKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAodGFyZ2V0X251bSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiTkVHIikpCiMgc2F2ZVJEUyhyNl9ORUcsICIuL21vZGVscy9yNl9ORUcuUkRTIikKCnI2X05FRyA8LSByZWFkUkRTKCIuL21vZGVscy9yNl9ORUcuUkRTIikKc3VtbWFyeShyNl9ORUcsIGNvcnIgPSBGKQpgYGAKCmBgYHtyfQojIHI2YV9ORUcgPC0gbG1lcihyZXNwb25zZSB+IHBvbHkodGFyZ2V0X251bSwgMykKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBSZXNwb25zZUlkKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IGNhcGFjaXR5KSwKIyAgICAgICAgICAgICAgICAgIGRfY2FwX3JhdGluZyAlPiUKIyAgICAgICAgICAgICAgICAgICAgbXV0YXRlKHRhcmdldF9udW0gPSB0YXJnZXRfbnVtLzEyKSAlPiUKIyAgICAgICAgICAgICAgICAgICAgZmlsdGVyKGRvbWFpbiA9PSAiTkVHIikpCiMgc2F2ZVJEUyhyNmFfTkVHLCAiLi9tb2RlbHMvcjZhX05FRy5SRFMiKQoKcjZhX05FRyA8LSByZWFkUkRTKCIuL21vZGVscy9yNmFfTkVHLlJEUyIpCnN1bW1hcnkocjZhX05FRywgY29yciA9IEYpCmBgYAoKIyMjIFNvY2lhbCBhYmlsaXRpZXMgJiBwb3NpdGl2ZSBlbW90aW9ucwoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjVfUE9TIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIlBPUyIpKQojIHNhdmVSRFMocjVfUE9TLCAiLi9tb2RlbHMvcjVfUE9TLlJEUyIpCgpyNV9QT1MgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjVfUE9TLlJEUyIpCnN1bW1hcnkocjVfUE9TLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByNWFfUE9TIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIlBPUyIpKQojIHNhdmVSRFMocjVhX1BPUywgIi4vbW9kZWxzL3I1YV9QT1MuUkRTIikKCnI1YV9QT1MgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjVhX1BPUy5SRFMiKQpzdW1tYXJ5KHI1YV9QT1MsIGNvcnIgPSBGKQpgYGAKCiMjIyMgTm9uLWxpbmVhciBlZmZlY3RzCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjZfUE9TIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHRhcmdldF9udW0sIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIlBPUyIpKQojIHNhdmVSRFMocjZfUE9TLCAiLi9tb2RlbHMvcjZfUE9TLlJEUyIpCgpyNl9QT1MgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjZfUE9TLlJEUyIpCnN1bW1hcnkocjZfUE9TLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByNmFfUE9TIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHRhcmdldF9udW0sIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIlBPUyIpKQojIHNhdmVSRFMocjZhX1BPUywgIi4vbW9kZWxzL3I2YV9QT1MuUkRTIikKCnI2YV9QT1MgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjZhX1BPUy5SRFMiKQpzdW1tYXJ5KHI2YV9QT1MsIGNvcnIgPSBGKQpgYGAKCiMjIyBOZWdhdGl2ZSBlbW90aW9ucwoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjVfQ09HIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkNPRyIpKQojIHNhdmVSRFMocjVfQ09HLCAiLi9tb2RlbHMvcjVfQ09HLlJEUyIpCgpyNV9DT0cgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjVfQ09HLlJEUyIpCnN1bW1hcnkocjVfQ09HLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByNWFfQ09HIDwtIGxtZXIocmVzcG9uc2UgfiB0YXJnZXRfbnVtCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkNPRyIpKQojIHNhdmVSRFMocjVhX0NPRywgIi4vbW9kZWxzL3I1YV9DT0cuUkRTIikKCnI1YV9DT0cgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjVhX0NPRy5SRFMiKQpzdW1tYXJ5KHI1YV9DT0csIGNvcnIgPSBGKQpgYGAKCiMjIyMgTm9uLWxpbmVhciBlZmZlY3RzCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjZfQ09HIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHRhcmdldF9udW0sIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkNPRyIpKQojIHNhdmVSRFMocjZfQ09HLCAiLi9tb2RlbHMvcjZfQ09HLlJEUyIpCgpyNl9DT0cgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjZfQ09HLlJEUyIpCnN1bW1hcnkocjZfQ09HLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByNmFfQ09HIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHRhcmdldF9udW0sIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkNPRyIpKQojIHNhdmVSRFMocjZhX0NPRywgIi4vbW9kZWxzL3I2YV9DT0cuUkRTIikKCnI2YV9DT0cgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjZhX0NPRy5SRFMiKQpzdW1tYXJ5KHI2YV9DT0csIGNvcnIgPSBGKQpgYGAKCiMjIFRhcmdldCBhZ2UgaW4gbW9udGhzIChzcXVhcmUtcm9vdCB0cmFuc2Zvcm1hdGlvbikKCiMjIyBCb2RpbHkgc2Vuc2F0aW9ucwoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjdfQk9EIDwtIGxtZXIocmVzcG9uc2UgfiBzcXJ0KHRhcmdldF9udW0pCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkJPRCIpKQojIHNhdmVSRFMocjdfQk9ELCAiLi9tb2RlbHMvcjdfQk9ELlJEUyIpCgpyN19CT0QgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjdfQk9ELlJEUyIpCnN1bW1hcnkocjdfQk9ELCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByN2FfQk9EIDwtIGxtZXIocmVzcG9uc2UgfiBzcXJ0KHRhcmdldF9udW0pCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkJPRCIpKQojIHNhdmVSRFMocjdhX0JPRCwgIi4vbW9kZWxzL3I3YV9CT0QuUkRTIikKCnI3YV9CT0QgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjdhX0JPRC5SRFMiKQpzdW1tYXJ5KHI3YV9CT0QsIGNvcnIgPSBGKQpgYGAKCiMjIyMgTm9uLWxpbmVhciBlZmZlY3RzCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjhfQk9EIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHNxcnQodGFyZ2V0X251bSksIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkJPRCIpKQojIHNhdmVSRFMocjhfQk9ELCAiLi9tb2RlbHMvcjhfQk9ELlJEUyIpCgpyOF9CT0QgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjhfQk9ELlJEUyIpCnN1bW1hcnkocjhfQk9ELCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByOGFfQk9EIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHNxcnQodGFyZ2V0X251bSksIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkJPRCIpKQojIHNhdmVSRFMocjhhX0JPRCwgIi4vbW9kZWxzL3I4YV9CT0QuUkRTIikKCnI4YV9CT0QgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjhhX0JPRC5SRFMiKQpzdW1tYXJ5KHI4YV9CT0QsIGNvcnIgPSBGKQpgYGAKCiMjIyBOZWdhdGl2ZSBlbW90aW9ucwoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjdfTkVHIDwtIGxtZXIocmVzcG9uc2UgfiBzcXJ0KHRhcmdldF9udW0pCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIk5FRyIpKQojIHNhdmVSRFMocjdfTkVHLCAiLi9tb2RlbHMvcjdfTkVHLlJEUyIpCgpyN19ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjdfTkVHLlJEUyIpCnN1bW1hcnkocjdfTkVHLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByN2FfTkVHIDwtIGxtZXIocmVzcG9uc2UgfiBzcXJ0KHRhcmdldF9udW0pCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIk5FRyIpKQojIHNhdmVSRFMocjdhX05FRywgIi4vbW9kZWxzL3I3YV9ORUcuUkRTIikKCnI3YV9ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjdhX05FRy5SRFMiKQpzdW1tYXJ5KHI3YV9ORUcsIGNvcnIgPSBGKQpgYGAKCiMjIyMgTm9uLWxpbmVhciBlZmZlY3RzCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjhfTkVHIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHNxcnQodGFyZ2V0X251bSksIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIk5FRyIpKQojIHNhdmVSRFMocjhfTkVHLCAiLi9tb2RlbHMvcjhfTkVHLlJEUyIpCgpyOF9ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjhfTkVHLlJEUyIpCnN1bW1hcnkocjhfTkVHLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByOGFfTkVHIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHNxcnQodGFyZ2V0X251bSksIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIk5FRyIpKQojIHNhdmVSRFMocjhhX05FRywgIi4vbW9kZWxzL3I4YV9ORUcuUkRTIikKCnI4YV9ORUcgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjhhX05FRy5SRFMiKQpzdW1tYXJ5KHI4YV9ORUcsIGNvcnIgPSBGKQpgYGAKCiMjIyBTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMKCiMjIyMgTGluZWFyIGVmZmVjdHMgb25seQoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI3X1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gc3FydCh0YXJnZXRfbnVtKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJQT1MiKSkKIyBzYXZlUkRTKHI3X1BPUywgIi4vbW9kZWxzL3I3X1BPUy5SRFMiKQoKcjdfUE9TIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I3X1BPUy5SRFMiKQpzdW1tYXJ5KHI3X1BPUywgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjdhX1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gc3FydCh0YXJnZXRfbnVtKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJQT1MiKSkKIyBzYXZlUkRTKHI3YV9QT1MsICIuL21vZGVscy9yN2FfUE9TLlJEUyIpCgpyN2FfUE9TIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I3YV9QT1MuUkRTIikKc3VtbWFyeShyN2FfUE9TLCBjb3JyID0gRikKYGBgCgojIyMjIE5vbi1saW5lYXIgZWZmZWN0cwoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHI4X1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICh0YXJnZXRfbnVtIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJQT1MiKSkKIyBzYXZlUkRTKHI4X1BPUywgIi4vbW9kZWxzL3I4X1BPUy5SRFMiKQoKcjhfUE9TIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I4X1BPUy5SRFMiKQpzdW1tYXJ5KHI4X1BPUywgY29yciA9IEYpCmBgYAoKYGBge3J9CiMgcjhhX1BPUyA8LSBsbWVyKHJlc3BvbnNlIH4gcG9seShzcXJ0KHRhcmdldF9udW0pLCAzKQojICAgICAgICAgICAgICAgICAgKyAoMSB8IFJlc3BvbnNlSWQpCiMgICAgICAgICAgICAgICAgICArICgxIHwgY2FwYWNpdHkpLAojICAgICAgICAgICAgICAgICAgZF9jYXBfcmF0aW5nICU+JQojICAgICAgICAgICAgICAgICAgICBtdXRhdGUodGFyZ2V0X251bSA9IHRhcmdldF9udW0vMTIpICU+JQojICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoZG9tYWluID09ICJQT1MiKSkKIyBzYXZlUkRTKHI4YV9QT1MsICIuL21vZGVscy9yOGFfUE9TLlJEUyIpCgpyOGFfUE9TIDwtIHJlYWRSRFMoIi4vbW9kZWxzL3I4YV9QT1MuUkRTIikKc3VtbWFyeShyOGFfUE9TLCBjb3JyID0gRikKYGBgCgojIyMgQ29nbml0aW9uICYgY29udHJvbAoKIyMjIyBMaW5lYXIgZWZmZWN0cyBvbmx5CgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjdfQ09HIDwtIGxtZXIocmVzcG9uc2UgfiBzcXJ0KHRhcmdldF9udW0pCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkNPRyIpKQojIHNhdmVSRFMocjdfQ09HLCAiLi9tb2RlbHMvcjdfQ09HLlJEUyIpCgpyN19DT0cgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjdfQ09HLlJEUyIpCnN1bW1hcnkocjdfQ09HLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByN2FfQ09HIDwtIGxtZXIocmVzcG9uc2UgfiBzcXJ0KHRhcmdldF9udW0pCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkNPRyIpKQojIHNhdmVSRFMocjdhX0NPRywgIi4vbW9kZWxzL3I3YV9DT0cuUkRTIikKCnI3YV9DT0cgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjdhX0NPRy5SRFMiKQpzdW1tYXJ5KHI3YV9DT0csIGNvcnIgPSBGKQpgYGAKCiMjIyMgTm9uLWxpbmVhciBlZmZlY3RzCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CiMgcjhfQ09HIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHNxcnQodGFyZ2V0X251bSksIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKHRhcmdldF9udW0gfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkNPRyIpKQojIHNhdmVSRFMocjhfQ09HLCAiLi9tb2RlbHMvcjhfQ09HLlJEUyIpCgpyOF9DT0cgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjhfQ09HLlJEUyIpCnN1bW1hcnkocjhfQ09HLCBjb3JyID0gRikKYGBgCgpgYGB7cn0KIyByOGFfQ09HIDwtIGxtZXIocmVzcG9uc2UgfiBwb2x5KHNxcnQodGFyZ2V0X251bSksIDMpCiMgICAgICAgICAgICAgICAgICArICgxIHwgUmVzcG9uc2VJZCkKIyAgICAgICAgICAgICAgICAgICsgKDEgfCBjYXBhY2l0eSksCiMgICAgICAgICAgICAgICAgICBkX2NhcF9yYXRpbmcgJT4lCiMgICAgICAgICAgICAgICAgICAgIG11dGF0ZSh0YXJnZXRfbnVtID0gdGFyZ2V0X251bS8xMikgJT4lCiMgICAgICAgICAgICAgICAgICAgIGZpbHRlcihkb21haW4gPT0gIkNPRyIpKQojIHNhdmVSRFMocjhhX0NPRywgIi4vbW9kZWxzL3I4YV9DT0cuUkRTIikKCnI4YV9DT0cgPC0gcmVhZFJEUygiLi9tb2RlbHMvcjhhX0NPRy5SRFMiKQpzdW1tYXJ5KHI4YV9DT0csIGNvcnIgPSBGKQpgYGAKCgojIFBsb3RzOiBSYXRpbmdzIGZvciBkZXZlbG9wbWVudGFsIGZhY3RvcnMsIGJ5IGRvbWFpbiBhbmQgY2FwYWNpdHkKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpnZ3Bsb3QoZF9kZXZfZmFjdG9yX3JhdGluZyAlPiUKICAgICAgICAgbXV0YXRlKGRvbWFpbiA9IHJlY29kZV9mYWN0b3IoCiAgICAgICAgICAgZG9tYWluLAogICAgICAgICAgICJCT0QiID0gIkJvZGlseSBzZW5zYXRpb25zIiwKICAgICAgICAgICAiTkVHIiA9ICJOZWdhdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIlBPUyIgPSAiU29jaWFsIGFiaWxpdGllcyAmIHBvc2l0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiQ09HIiA9ICJDb2duaXRpb24gJiBjb250cm9sIiwKICAgICAgICAgICAuZGVmYXVsdCA9IE5BX2NoYXJhY3Rlcl8pKSAlPiUKICAgICAgICAgbXV0YXRlX2F0KHZhcnMoY2FwYWNpdHksIGRldl9mYWN0b3IpLAogICAgICAgICAgICAgICAgICAgZnVucyhnc3ViKCJfIiwgIiAiLCAuKSkpICU+JQogICAgICAgICBtdXRhdGUoZGV2X2ZhY3RvciA9IGZhY3RvcigKICAgICAgICAgICBkZXZfZmFjdG9yLAogICAgICAgICAgIGxldmVscyA9IGdzdWIoIl8iLCAiICIsIGxldmVscyhkX2Rldl9mYWN0b3JfcmF0aW5nJGRldl9mYWN0b3IpKSkpLAogICAgICAgYWVzKHggPSBkZXZfZmFjdG9yLCB5ID0gcmVzcG9uc2UsIGNvbG9yID0gZG9tYWluKSkgKwogIGZhY2V0X3dyYXAofiBkb21haW4gfiBjYXBhY2l0eSwgbmNvbCA9IDQpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMDI1LCBoZWlnaHQgPSAwLjIsIHdpZHRoID0gMC4yKSArCiAgZ2VvbV9wb2ludHJhbmdlKGRhdGEgPSAuICU+JSBncm91cF9ieShkb21haW4sIGNhcGFjaXR5LCBkZXZfZmFjdG9yKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJyZXNwb25zZSIsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGZhdHRlbiA9IDQpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJSYXRpbmdzIG9mIGRldmVsb3BtZW50YWwgZmFjdG9ycyAoVmVyc2lvbiAxKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJFcnJvciBiYXJzIGFyZSBib290c3RyYXBwZWQgOTUlIENJcyIsCiAgICAgICB4ID0gIkRldmVsb3BtZW50YWwgZmFjdG9yIiwgCiAgICAgICB5ID0gIlJlc3BvbnNlICgwID0gcGxheXMgbm8gcm9sZSwgNiA9IHBsYXlzIGEgdmVyeSBpbXBvcnRhbnQgcm9sZSkiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpnZ3Bsb3QoZF9kZXZfZmFjdG9yX3JhdGluZyAlPiUKICAgICAgICAgbXV0YXRlKGRvbWFpbiA9IHJlY29kZV9mYWN0b3IoCiAgICAgICAgICAgZG9tYWluLAogICAgICAgICAgICJCT0QiID0gIkJvZGlseSBzZW5zYXRpb25zIiwKICAgICAgICAgICAiTkVHIiA9ICJOZWdhdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIlBPUyIgPSAiU29jaWFsIGFiaWxpdGllcyAmIHBvc2l0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiQ09HIiA9ICJDb2duaXRpb24gJiBjb250cm9sIiwKICAgICAgICAgICAuZGVmYXVsdCA9IE5BX2NoYXJhY3Rlcl8pKSAlPiUKICAgICAgICAgbXV0YXRlX2F0KHZhcnMoY2FwYWNpdHksIGRldl9mYWN0b3IpLAogICAgICAgICAgICAgICAgICAgZnVucyhnc3ViKCJfIiwgIiAiLCAuKSkpICU+JQogICAgICAgICBtdXRhdGUoZGV2X2ZhY3RvciA9IGZhY3RvcigKICAgICAgICAgICBkZXZfZmFjdG9yLAogICAgICAgICAgIGxldmVscyA9IGdzdWIoIl8iLCAiICIsIGxldmVscyhkX2Rldl9mYWN0b3JfcmF0aW5nJGRldl9mYWN0b3IpKSkpLAogICAgICAgYWVzKHggPSByZW9yZGVyKGNhcGFjaXR5LCBhcy5udW1lcmljKGRvbWFpbikpLCAKICAgICAgICAgICB5ID0gcmVzcG9uc2UsIGNvbG9yID0gZG9tYWluKSkgKwogIGZhY2V0X3dyYXAofiBkZXZfZmFjdG9yLCBuY29sID0gNSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4wMjUsIGhlaWdodCA9IDAuMiwgd2lkdGggPSAwLjIpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lIGdyb3VwX2J5KGRvbWFpbiwgY2FwYWNpdHksIGRldl9mYWN0b3IpICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInJlc3BvbnNlIiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gNCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGd1aWRlcyhjb2xvciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KGFscGhhID0gMSwgc2l6ZSA9IDMpKSkgKwogIGxhYnModGl0bGUgPSAiUmF0aW5ncyBvZiBkZXZlbG9wbWVudGFsIGZhY3RvcnMgKFZlcnNpb24gMikiLAogICAgICAgc3VidGl0bGUgPSAiRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgY29sb3IgPSAiRG9tYWluIiwKICAgICAgIHggPSAiQ2FwYWNpdHkgKGJ5IGRvbWFpbikiLCAKICAgICAgIHkgPSAiUmVzcG9uc2UgKDAgPSBwbGF5cyBubyByb2xlLCA2ID0gcGxheXMgYSB2ZXJ5IGltcG9ydGFudCByb2xlKSIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDQsIGZpZy5hc3AgPSAwLjh9CmdncGxvdChkX2Rldl9mYWN0b3JfcmF0aW5nICU+JQogICAgICAgICBtdXRhdGUoZGV2X2ZhY3RvciA9IGZhY3RvcigKICAgICAgICAgICBnc3ViKCJfIiwgIiAiLCBkZXZfZmFjdG9yKSwKICAgICAgICAgICBsZXZlbHMgPSBnc3ViKCJfIiwgIiAiLCBsZXZlbHMoZF9kZXZfZmFjdG9yX3JhdGluZyRkZXZfZmFjdG9yKSkpKSwKICAgICAgIGFlcyh4ID0gZGV2X2ZhY3RvciwgeSA9IHJlc3BvbnNlKSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4wMSwgaGVpZ2h0ID0gMC4zLCB3aWR0aCA9IDAuMywgY29sb3IgPSAiYmx1ZSIpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lIGdyb3VwX2J5KGRldl9mYWN0b3IpICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInJlc3BvbnNlIiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gMikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlJhdGluZ3Mgb2YgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIChWZXJzaW9uIDMpIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIHggPSAiRGV2ZWxvcG1lbnRhbCBmYWN0b3IiLCAKICAgICAgIHkgPSAiUmVzcG9uc2UgKDAgPSBwbGF5cyBubyByb2xlLCA2ID0gcGxheXMgYSB2ZXJ5IGltcG9ydGFudCByb2xlKSIpCmBgYAoKCiMgRXhwbG9yYXRpb246IEVGQS9jbHVzdGVyaW5nIG9mIGRldmVsb3BtZW50YWwgZmFjdG9ycwoKSXQgY291bGQgYmUgbmljZSB0byByZWR1Y2UgdGhlIG51bWJlciBvZiAiZGV2bGVvcG1lbnRhbCBmYWN0b3JzIiBmcm9tIDEwIGRvd24gdG8gc29tZXRoaW5nIG1vcmUgbWFuYWdlYWJsZSBmb3IgYW5hbHlzaXMuIEhlcmUgSSBleHBsb3JlIEVGQSBhbmQgaGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgYXMgZGltZW5zaW9uIHJlZHVjdGlvbiBtZXRob2RzLCBhbmQgcmUtcGxvdCB3aXRoIHRoZXNlIHJlc3VsdHMgaW4gbWluZC4KClBhcmFsbGVsIHRvIHdoYXQgd2UndmUgZG9uZSBmb3IgZGltZW5zaW9uYWxpdHkgcmVkdWN0aW9uIGFjcm9zcyBjYXBhY2l0aWVzLCB0byBkbyB0aGlzIEknbGwgaWdub3JlIHNvbWUgYXNwZWN0cyBvZiB0aGUgd2l0aGluLXN1YmplY3RzIGRlc2lnbiBvZiB0aGlzIHN0dWR5LiBJJ2xsIGNvbnNpZGVyIGVhY2ggY29tYmluYXRpb24gb2YgcGFydGljaXBhbnQgYW5kIGNhcGFjaXR5IHRvIGJlIGEgc2VwYXJhdGUgc2V0IG9mIG9ic2VydmF0aW9ucyBmb3IgdGhpcyBhbmFseXNpcyAoZWZmZWN0aXZlbHksIGFjdGluZyBhcyB0aG91Z2ggZWFjaCBwYXJ0aWNpcGFudCB3ZXJlIHJlYWxseSA4IGRpZmZlcmVudCBwYXJ0aWNpcGFudHMsIGVhY2ggb2Ygd2hvbSBldmFsdWF0ZWQgYSBkaWZmZXJlbnQgY2FwYWNpdHkgb24gdGhlIDEwIGRldmVsb3BtZW50YWwgZmFjdG9ycyBpbmNsdWRlZCBpbiB0aGUgc3R1ZHkpLgoKYGBge3J9CmRfZGV2X2ZhY3Rvcl9yYXRpbmdfd2lkZSA8LSBkX2Rldl9mYWN0b3JfcmF0aW5nICU+JQogIHVuaXRlKGtleSwgUmVzcG9uc2VJZCwgZG9tYWluLCBjYXBhY2l0eSkgJT4lCiAgIyBtdXRhdGUocmVzcG9uc2UgPSByZXNwb25zZSAtIDMpICU+JSAjIGNlbnRlciBhdCAwCiAgc3ByZWFkKGRldl9mYWN0b3IsIHJlc3BvbnNlKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoImtleSIpCmBgYAoKIyMgRXhwbG9yYXRvcnkgZmFjdG9yIGFuYWx5c2lzCgpgYGB7cn0KcmV0ZW5fZnVuKGRfZGV2X2ZhY3Rvcl9yYXRpbmdfd2lkZSwgY2hvc2VuX3JvdCkKYGBgCgpgYGB7cn0KZmEucGFyYWxsZWwoZF9kZXZfZmFjdG9yX3JhdGluZ193aWRlKQpgYGAKCmBgYHtyfQpWU1MoZF9kZXZfZmFjdG9yX3JhdGluZ193aWRlLCByb3RhdGUgPSBjaG9zZW5fcm90KQpgYGAKCkRpZmZlcmVudCBmYWN0b3IgcmV0ZW50aW9uIHByb3RvY29scyBzdWdnZXN0IHJldGFpbmluZyBkaWZmZXJlbnQgbnVtYmVycyBvZiBmYWN0b3JzICgyLCA0LCBvciA1KToKCmBgYHtyfQpkZXZfZmFjdG9yX3JhdGluZ19lZmEyIDwtIGZhKGRfZGV2X2ZhY3Rvcl9yYXRpbmdfd2lkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZmFjdG9ycyA9IDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlID0gY2hvc2VuX3JvdCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuN30KaGVhdG1hcF9mdW4oZGV2X2ZhY3Rvcl9yYXRpbmdfZWZhMikgKyAKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDgsIGJhcndpZHRoID0gMC41KSkgKwogIGxhYnModGl0bGUgPSAiRUZBIG9mIGRldmVsb3BtZW50YWwgZmFjdG9yIHJhdGluZ3MiLAogICAgICAgc3VidGl0bGUgPSAiUmV0YWluaW5nIDIgZmFjdG9ycyAocmV0ZW50aW9uIHByb3RvY29sOiBXZWlzbWFuIGV0IGFsLiwgMjAxNykiKQpgYGAKCmBgYHtyfQpkZXZfZmFjdG9yX3JhdGluZ19lZmE0IDwtIGZhKGRfZGV2X2ZhY3Rvcl9yYXRpbmdfd2lkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZmFjdG9ycyA9IDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlID0gY2hvc2VuX3JvdCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuN30KaGVhdG1hcF9mdW4oZGV2X2ZhY3Rvcl9yYXRpbmdfZWZhNCkgKyAKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDgsIGJhcndpZHRoID0gMC41KSkgKwogIGxhYnModGl0bGUgPSAiRUZBIG9mIGRldmVsb3BtZW50YWwgZmFjdG9yIHJhdGluZ3MiLAogICAgICAgc3VidGl0bGUgPSAiUmV0YWluaW5nIDQgZmFjdG9ycyAocmV0ZW50aW9uIHByb3RvY29sOiBwYXJhbGxlbCBhbmFseXNpcykiKQpgYGAKCmBgYHtyfQpkZXZfZmFjdG9yX3JhdGluZ19lZmE1IDwtIGZhKGRfZGV2X2ZhY3Rvcl9yYXRpbmdfd2lkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZmFjdG9ycyA9IDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlID0gY2hvc2VuX3JvdCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuN30KaGVhdG1hcF9mdW4oZGV2X2ZhY3Rvcl9yYXRpbmdfZWZhNSkgKyAKICBndWlkZXMoZmlsbCA9IGd1aWRlX2NvbG9yYmFyKGJhcmhlaWdodCA9IDgsIGJhcndpZHRoID0gMC41KSkgKwogIGxhYnModGl0bGUgPSAiRUZBIG9mIGRldmVsb3BtZW50YWwgZmFjdG9yIHJhdGluZ3MiLAogICAgICAgc3VidGl0bGUgPSAiUmV0YWluaW5nIDUgZmFjdG9ycyAocmV0ZW50aW9uIHByb3RvY29sOiBtaW5pbWl6aW5nIEJJQykiKQpgYGAKClRoZSAyLSBhbmQgNC1mYWN0b3Igc29sdXRpb25zIGVhY2ggc2VlbSB0byBvZmZlciBzb21lIGFkdmFudGFnZXMuLi4gdGhlIDUtZmFjdG9yIHNvbHV0aW9uIGlzIHNlbnNpYmxlIHRvbywgaXQganVzdCBkb2Vzbid0IG9mZmVyIG11Y2ggaW4gdGhlIHdheSBvZiByZWR1Y2luZyB0aGUgZGF0YXNldCEKCgojIyBIaWVyYXJjaGljYWwgY2x1c3RlcmluZwoKYGBge3J9CmRldl9mYWN0b3JfcmF0aW5nX2hjbHVzdCA8LSBkX2Rldl9mYWN0b3JfcmF0aW5nX3dpZGUgJT4lCiAgdCgpICU+JQogIGRpc3QoKSAlPiUKICBoY2x1c3QoKQoKIyBkZXZfZmFjdG9yX3JhdGluZ19oY2x1c3Rfb3JkZXIgPC0gZGF0YS5mcmFtZSgKIyAgIG9yZGVyID0gYXMubnVtZXJpYyhkZXZfZmFjdG9yX3JhdGluZ19oY2x1c3Qkb3JkZXIpLCAKIyAgIGRldl9mYWN0b3IgPSBhcy5jaGFyYWN0ZXIoZGV2X2ZhY3Rvcl9yYXRpbmdfaGNsdXN0JGxhYmVscykpCgojIGNhbm5vdCBmaWd1cmUgb3V0IGhvdyB0byBkbyB0aGlzIGF1dG9tYXRpY2FsbHkhCmRldl9mYWN0b3JfcmF0aW5nX2hjbHVzdF9vcmRlciA8LSBjKCJleHBlcmltZW50cyIsICJwZW9wbGVfdGVhY2giLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnJhaW5fY2hhbmdlcyIsICJvYnNlcnZlc19vYmplY3RzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvYnNlcnZlc19wZW9wbGUiLCAiaW50ZXJhY3RzX3Blb3BsZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJlcHJvZ3JhbW1lZCIsICJ3b21iX2V4cGVyaWVuY2VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJib2R5X2dyb3dzIiwgInNlbnNlc19pbXByb3ZlIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMywgZmlnLmFzcCA9IDAuNn0KZGV2X2ZhY3Rvcl9yYXRpbmdfaGNsdXN0ICU+JQogIGdnZGVuZHJvZ3JhbShyb3RhdGUgPSBGKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZSgjYXhpcy50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAjIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIHBhbmVsLmdyaWQubWlub3IueCA9IGVsZW1lbnRfYmxhbmsoKSkgKwogIGxhYnModGl0bGUgPSAiSGllcmFyY2hpY2FsIGFnZ2xvbWVyYXRpdmUgY2x1c3RlcmluZyIsIAogICAgICAgc3VidGl0bGUgPSAiQ29tcGxldGUgbGlua2FnZSAoZGVmYXVsdCBmb3Igc3RhdHM6OmhjbHVzdCgpIGZ1bmN0aW9uKSIsCiAgICAgICB4ID0gIkRldmVsb3BtZW50YWwgZmFjdG9yIiwgeSA9ICJIZWlnaHQiKQogICMgYXMuZGVuZHJvZ3JhbSgpICU+JQogICMgc2V0KCJsYWJlbHNfY29sIiwgayA9IDIpICU+JQogICMgcGxvdChob3JpeiA9IFQsIHhsaW0gPSBjKC0xMDAsIDIwMCkpCmBgYAoKVGhpcyBsb29rcyBhIGxvdCBsaWtlIHRoZSAyLWZhY3RvciBFRkEgc29sdXRpb24gdG8gbWUhCgojIyBSZS1wbG90dGluZyBieSBjbHVzdGVyCgpMZXQncyBwcm9jZWVkIHdpdGggdGhlIGNsdXN0ZXJpbmcgb2YgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIHN1Z2dlc3RlZCBieSB0aGUgMi1mYWN0b3IgRUZBIHNvbHV0aW9uIGFuZCBieSBoaWVyYXJjaGljYWwgY2x1c3RlcmluZy4KCmBgYHtyfQpkX2Rldl9mYWN0b3JfcmF0aW5nX2J5Y2x1c3QgPC0gZF9kZXZfZmFjdG9yX3JhdGluZyAlPiUKICBtdXRhdGUoZGV2X2ZhY3Rvcl9jbHVzdGVyID0gY2FzZV93aGVuKAogICAgZGV2X2ZhY3RvciAlaW4lIGMoImV4cGVyaW1lbnRzIiwgInBlb3BsZV90ZWFjaCIsICJicmFpbl9jaGFuZ2VzIiwgCiAgICAgICAgICAgICAgICAgICAgICAib2JzZXJ2ZXNfb2JqZWN0cyIsICJvYnNlcnZlc19wZW9wbGUiLCAKICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdHNfcGVvcGxlIikgfiAiZXh0cmluc2ljIiwKICAgIGRldl9mYWN0b3IgJWluJSBjKCJwcmVwcm9ncmFtbWVkIiwgIndvbWJfZXhwZXJpZW5jZXMiLCAiYm9keV9ncm93cyIsIAogICAgICAgICAgICAgICAgICAgICAgInNlbnNlc19pbXByb3ZlIikgfiAiaW50cmluc2ljIiwKICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSkgJT4lCiAgbXV0YXRlKGRldl9mYWN0b3JfY2x1c3RlciA9IGZhY3RvcihkZXZfZmFjdG9yX2NsdXN0ZXIpLAogICAgICAgICBkZXZfZmFjdG9yID0gZmFjdG9yKGRldl9mYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gZGV2X2ZhY3Rvcl9yYXRpbmdfaGNsdXN0X29yZGVyKSwKICAgICAgICAgcmVzcG9uc2VfY2VudCA9IHJlc3BvbnNlIC0gMykKCmNvbnRyYXN0c19jbHVzdGVyX2VmZiA8LSBjYmluZChFWFQgPSBjKDEsIC0xKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuN30KZ2dwbG90KGRfZGV2X2ZhY3Rvcl9yYXRpbmdfYnljbHVzdCAlPiUKICAgICAgICAgbXV0YXRlKGRvbWFpbiA9IHJlY29kZV9mYWN0b3IoCiAgICAgICAgICAgZG9tYWluLAogICAgICAgICAgICJCT0QiID0gIkJvZGlseSBzZW5zYXRpb25zIiwKICAgICAgICAgICAiTkVHIiA9ICJOZWdhdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIlBPUyIgPSAiU29jaWFsIGFiaWxpdGllcyAmIHBvc2l0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiQ09HIiA9ICJDb2duaXRpb24gJiBjb250cm9sIiwKICAgICAgICAgICAuZGVmYXVsdCA9IE5BX2NoYXJhY3Rlcl8pKSAlPiUKICAgICAgICAgbXV0YXRlX2F0KHZhcnMoY2FwYWNpdHksIGRldl9mYWN0b3IpLAogICAgICAgICAgICAgICAgICAgZnVucyhnc3ViKCJfIiwgIiAiLCAuKSkpICU+JQogICAgICAgICBtdXRhdGUoZGV2X2ZhY3RvciA9IGZhY3RvcigKICAgICAgICAgICBkZXZfZmFjdG9yLAogICAgICAgICAgIGxldmVscyA9IGdzdWIoIl8iLCAiICIsIGRldl9mYWN0b3JfcmF0aW5nX2hjbHVzdF9vcmRlcikpKSwKICAgICAgIGFlcyh4ID0gZGV2X2ZhY3RvciwgCiAgICAgICAgICAgeSA9IHJlc3BvbnNlLCBjb2xvciA9IGRvbWFpbiwgc2hhcGUgPSBkZXZfZmFjdG9yX2NsdXN0ZXIpKSArCiAgZmFjZXRfd3JhcCh+IGRvbWFpbiB+IGNhcGFjaXR5LCBuY29sID0gNCkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4wMjUsIGhlaWdodCA9IDAuMiwgd2lkdGggPSAwLjIsIHNob3cubGVnZW5kID0gRikgKwogIGdlb21fcG9pbnRyYW5nZShkYXRhID0gLiAlPiUgZ3JvdXBfYnkoZG9tYWluLCBjYXBhY2l0eSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfZmFjdG9yX2NsdXN0ZXIsIGRldl9mYWN0b3IpICU+JQogICAgICAgICAgICAgICAgICAgIG11bHRpX2Jvb3Rfc3RhbmRhcmQoY29sID0gInJlc3BvbnNlIiwgbmEucm0gPSBUKSwKICAgICAgICAgICAgICAgICAgYWVzKHkgPSBtZWFuLCB5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIGNvbG9yID0gImJsYWNrIiwgZmF0dGVuID0gNCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSkgKwogIGxhYnModGl0bGUgPSAiUmF0aW5ncyBvZiBkZXZlbG9wbWVudGFsIGZhY3RvcnMgKFZlcnNpb24gMSkiLAogICAgICAgc3VidGl0bGUgPSAiRXJyb3IgYmFycyBhcmUgYm9vdHN0cmFwcGVkIDk1JSBDSXMiLAogICAgICAgc2hhcGUgPSAiVHlwZSBvZiBkZXZlbG9wbWVudGFsIGZhY3RvciAocGVyIEVGQS9jbHVzdGVyaW5nKSIsCiAgICAgICB4ID0gIkRldmVsb3BtZW50YWwgZmFjdG9yIiwgCiAgICAgICB5ID0gIlJlc3BvbnNlICgwID0gcGxheXMgbm8gcm9sZSwgNiA9IHBsYXlzIGEgdmVyeSBpbXBvcnRhbnQgcm9sZSkiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpnZ3Bsb3QoZF9kZXZfZmFjdG9yX3JhdGluZ19ieWNsdXN0ICU+JQogICAgICAgICBtdXRhdGUoZG9tYWluID0gcmVjb2RlX2ZhY3RvcigKICAgICAgICAgICBkb21haW4sCiAgICAgICAgICAgIkJPRCIgPSAiQm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICJORUciID0gIk5lZ2F0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiUE9TIiA9ICJTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJDT0ciID0gIkNvZ25pdGlvbiAmIGNvbnRyb2wiLAogICAgICAgICAgIC5kZWZhdWx0ID0gTkFfY2hhcmFjdGVyXykpICU+JQogICAgICAgICBtdXRhdGVfYXQodmFycyhjYXBhY2l0eSksCiAgICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIl8iLCAiICIsIC4pKSksCiAgICAgICBhZXMoeCA9IHJlb3JkZXIoY2FwYWNpdHksIGFzLm51bWVyaWMoZG9tYWluKSksIAogICAgICAgICAgIHkgPSByZXNwb25zZSwgY29sb3IgPSBkb21haW4pKSArCiAgZmFjZXRfd3JhcChkZXZfZmFjdG9yX2NsdXN0ZXIgfiBkZXZfZmFjdG9yLCBuY29sID0gNikgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4wMjUsIGhlaWdodCA9IDAuMiwgd2lkdGggPSAwLjIpICsKICBnZW9tX3BvaW50cmFuZ2UoZGF0YSA9IC4gJT4lIGdyb3VwX2J5KGRvbWFpbiwgY2FwYWNpdHksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2X2ZhY3Rvcl9jbHVzdGVyLCBkZXZfZmFjdG9yKSAlPiUKICAgICAgICAgICAgICAgICAgICBtdWx0aV9ib290X3N0YW5kYXJkKGNvbCA9ICJyZXNwb25zZSIsIG5hLnJtID0gVCksCiAgICAgICAgICAgICAgICAgIGFlcyh5ID0gbWVhbiwgeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBjb2xvciA9ICJibGFjayIsIGZhdHRlbiA9IDQpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBndWlkZXMoY29sb3IgPSBndWlkZV9sZWdlbmQob3ZlcnJpZGUuYWVzID0gbGlzdChhbHBoYSA9IDEsIHNpemUgPSAzKSkpICsKICBsYWJzKHRpdGxlID0gIlJhdGluZ3Mgb2YgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIChWZXJzaW9uIDMpIiwKICAgICAgIHN1YnRpdGxlID0gIkVycm9yIGJhcnMgYXJlIGJvb3RzdHJhcHBlZCA5NSUgQ0lzIiwKICAgICAgIGNvbG9yID0gIkRvbWFpbiIsCiAgICAgICB4ID0gIkNhcGFjaXR5IChieSBkb21haW4pIiwgCiAgICAgICB5ID0gIlJlc3BvbnNlICgwID0gcGxheXMgbm8gcm9sZSwgNiA9IHBsYXlzIGEgdmVyeSBpbXBvcnRhbnQgcm9sZSkiKQpgYGAKCgpgYGB7cn0Kcl9kZXZfZmFjdG9yX3JhdGluZyA8LSBsbWVyKHJlc3BvbnNlIH4gZG9tYWluICogZGV2X2ZhY3Rvcl9jbHVzdGVyICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKGRvbWFpbiArIGRldl9mYWN0b3JfY2x1c3RlciB8IFJlc3BvbnNlSWQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBOT1RFOiBpbmNsdWRpbmcgYm90aCByYW5kb20gaW50ZXJjZXB0cyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB5aWVsZHMgY29yciA+IDAuOQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSArIGRldl9mYWN0b3JfY2x1c3RlciB8IFJlc3BvbnNlSWQpICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgfCBjYXBhY2l0eSkgKyAoMSB8IGRldl9mYWN0b3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9kZXZfZmFjdG9yX3JhdGluZ19ieWNsdXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhc3RzID0gbGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluID0gY29udHJhc3RzX2RvbWFpbl9lZmZfbm9CT0QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldl9mYWN0b3JfY2x1c3RlciA9IGNvbnRyYXN0c19jbHVzdGVyX2VmZikpCmBgYAoKYGBge3J9CnN1bW1hcnkocl9kZXZfZmFjdG9yX3JhdGluZykKYGBgCgooTm90ZSB0aGF0IGRvbWFpbiB3YXMgZWZmZWN0LWNvZGVkIGFuZCBsZWF2ZXMgb3V0IHRoZSBfYm9kaWx5IHNlbnNhdGlvbnNfIGRvbWFpbiBoZXJlLCBidXQgd2UgY291bGQgcmUtY29kZSBpdCBpbiBhbGwgdGhlIGRpZmZlcmVudCB3YXlzIHRvIGdldCB0aGUgY29udHJhc3QgYmV0d2VlbiBfYm9kaWx5IHNlbnNhdGlvbnNfIGFuZCB0aGUgZ3JhbmQgbWVhbiBhcyBkZXNpcmVkLikKCkkgc2VlIHRocmVlIHRha2UtYXdheXMgZnJvbSB0aGVzZSByZWdyZXNzaW9uIHJlc3VsdHMsIGFsbCBvZiB3aGljaCBJIHRoaW5rIEkgY2FuIHNlZSByZWZsZWN0ZWQgaW4gdGhlIHBsb3RzIGFib3ZlOgoKMS4gUGFydGljaXBhbnRzIHBlcmNlaXZlZCB0aGUgZG9tYWluIG9mIF9zb2NpYWwgY29ubmVjdGlvbiBhbmQgcG9zaXRpdmUgZW1vdGlvbnNfIHRvIGJlIHBhcnRpY3VsYXJseSBkcmFtYXRpY2FsbHkgc2hhcGVkIGJ5IHRoZSBzZXQgb2YgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIHdlIGluY2x1ZGVkIGluIHRoaXMgc3R1ZHkgKHJlbGF0aXZlIHRvIHRoZSBncmFuZCBtZWFuIGNvbGxhcHNpbmcgYWNyb3NzIGRvbWFpbnMpLgoyLiBPbiB0aGUgd2hvbGUsIHBhcnRpY2lwYW50cyBlbmRvcnNlZCAiZXh0cmluc2ljIiBhbmQgImludHJpbnNpYyIgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIGVxdWFsbHkgc3Ryb25nbHkuIElmIHdlIHdlcmUgbWFwcGluZyB0aGlzIG9udG8gc29tZSBzb3J0IG9mIG5hdHVyZS1udXJ1dHVyZSBkaXN0aW5jdGlvbiAobm90IHBlcmZlY3QsIGJ1dCB0ZW1wdGluZyksIEkgdGhpbmsgd2UnZCBzYXkgdGhhdCB0aGVyZSdzIG5vIGV2aWRlbmNlIGZvciBwYXJ0aWNpcGFudHMgZmF2b3JpbmcgZWl0aGVyIG5hdHVyZSBvciBudXJ0dXJlIG92ZXIgdGhlIG90aGVyIGFzIGFuIGV4cGxhbmF0aW9uIGZvciBncm93dGggaW4gdGhlIGNhcGFjaXRpZXMgd2UgaW5jbHVkZWQgaW4gdGhpcyBzdHVkeS4KMy4gSG93ZXZlciwgdGhlaXIgZW5kb3JzZW1lbnQgb2YgImV4dHJpbnNpYyIgYW5kICJpbnRyaW5zaWMiIGRldmVsb3BtZW50YWwgZmFjdG9ycyB2YXJpZWQgYnkgZG9tYWluLiBUaGV5IHBlcmNlaXZlZCAiZXh0cmluc2ljIiBmYWN0b3JzIHRvIHBsYXkgYSBsYXJnZXIgcm9sZSBpbiB0aGUgZG9tYWlucyBvZiBfc29jaWFsIGNvbm5lY3Rpb24gYW5kIHBvc2l0aXZlIGVtb3Rpb25zXyBhbmQgZXNwZWNpYWxseSBfY29nbml0aW9uIGFuZCBjb250cm9sXywgYW5kIGEgcmVsYXRpdmVseSBzbWFsbCByb2xlIGluIHRoZSBkb21haW4gb2YgX25lZ2F0aXZlIGVtb3Rpb25zXy4gKExvb2tpbmcgYXQgdGhlIHBsb3RzLCBpdCBzZWVtcyBsaWtlIGV4dHJpbnNpYyBmYWN0b3JzIHdlcmUgcGVyY2VpdmVkIGFzIG11Y2ggbW9yZSBpbXBvcnRhbnQgdGhhbiBpbnRyaW5zaWMgZmFjdG9ycyBmb3IgX2NvZ25pdGlvbiBhbmQgY29udHJvbF8sIGEgYml0IG1vcmUgaW1wb3J0YW50IHRoYW4gaW50cmluc2ljIGZhY3RvcnMgZm9yIF9zb2NpYWwgY29ubmVjdGlvbiBhbmQgcG9zaXRpdmUgZW1vdGlvbnNfLCByb3VnaGx5IGVxdWFsbHkgaW1wb3J0YW50IHRvIGludHJpbnNpYyBmYWN0b3JzIGZvciBfbmVnYXRpdmUgZW1vdGlvbnNfLCBhbmQgbGVzcyBpbXBvcnRhbnQgdGhhbiBpbnRyaW5zaWMgZmFjdG9ycyBmb3IgX2JvZGlseSBzZW5zYXRpb25zXy4gVGhlc2UgaW50ZXJhY3Rpb24gdGVybXMganVzdCBjb25maXJtIHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAiZXh0cmluc2ljIiBhbmQgImludHJpbnNpYyIgdmFyaWVkIHNpZ25pZmljYW50bHkgYWNyb3NzIGRvbWFpbnMuKSAKCgojIFRhYmxlOiBBbnN3ZXJzIHRvIChvcHRpb25hbCkgZnJlZS1yZXNwb25zZSBxdWVzdGlvbiBhYm91dCBvdGhlciBkZXZlbG9wbWVudGFsIGZhY3RvcnMKCmBgYHtyfQpkX2Rldl9mYWN0b3Jfb3RoZXIgJT4lCiAgbXV0YXRlKGRvbWFpbiA9IHJlY29kZV9mYWN0b3IoCiAgICBkb21haW4sCiAgICAiQk9EIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAiTkVHIiA9ICJOZWdhdGl2ZSBlbW90aW9ucyIsCiAgICAiUE9TIiA9ICJTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMiLAogICAgIkNPRyIgPSAiQ29nbml0aW9uICYgY29udHJvbCIsCiAgICAuZGVmYXVsdCA9IE5BX2NoYXJhY3Rlcl8pLAogICAgY2FwYWNpdHkgPSBnc3ViKCJfIiwgIiAiLCBjYXBhY2l0eSkpICU+JQogIGZpbHRlcihyZXNwb25zZSAhPSAiaWRrIikgJT4lCiAgZGlzdGluY3QoZG9tYWluLCBjYXBhY2l0eSwgcmVzcG9uc2UpICU+JQogIGFycmFuZ2UoZG9tYWluLCBjYXBhY2l0eSwgcmVzcG9uc2UpICU+JQogIGthYmxlKGNhcHRpb24gPSAiRnJlZSByZXNwb25zZXMgdG8gb3B0aW9uYWwgcXVlc3Rpb24gYWJvdXQgb3RoZXIgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIHRoYXQgbWlnaHQgcGxheSBhIHJvbGUgKGV4Y2x1ZGluZyBhbnN3ZXJzIGxpa2UgJ04vQSwnICdubywnICdub3QgdGhhdCBJIGNhbiB0aGluayBvZicsIGV0Yy4pIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGNvbGxhcHNlX3Jvd3MoMToyKQpgYGAKCgojIFBsb3RzOiBNb3N0IGltcG9ydGFudCBkZXZlbG9wbWVudGFsIGZhY3RvciwgYnkgZG9tYWluIGFuZCBjYXBhY2l0eQoKYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjd9CmdncGxvdChkX2Rldl9mYWN0b3JfbW9zdF9pbXBvcnRhbnRfY2hvaWNlICU+JQogICAgICAgICBtdXRhdGUoZG9tYWluID0gcmVjb2RlX2ZhY3RvcigKICAgICAgICAgICBkb21haW4sCiAgICAgICAgICAgIkJPRCIgPSAiQm9kaWx5IHNlbnNhdGlvbnMiLAogICAgICAgICAgICJORUciID0gIk5lZ2F0aXZlIGVtb3Rpb25zIiwKICAgICAgICAgICAiUE9TIiA9ICJTb2NpYWwgYWJpbGl0aWVzICYgcG9zaXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJDT0ciID0gIkNvZ25pdGlvbiAmIGNvbnRyb2wiLAogICAgICAgICAgIC5kZWZhdWx0ID0gTkFfY2hhcmFjdGVyXykpICU+JQogICAgICAgICBtdXRhdGUoZGV2X2ZhY3RvciA9IGNhc2Vfd2hlbigKICAgICAgICAgICBncmVwbCgiT3RoZXIiLCByZXNwb25zZSkgfiAib3RoZXIiLAogICAgICAgICAgIGdyZXBsKCJ0ZWFjaCIsIHJlc3BvbnNlKSB+ICJwZW9wbGUgdGVhY2giLAogICAgICAgICAgIGdyZXBsKCJleHBlcmltZW50cyIsIHJlc3BvbnNlKSB+ICJleHBlcmltZW50cyIsCiAgICAgICAgICAgZ3JlcGwoIndvbWIiLCByZXNwb25zZSkgfiAid29tYiBleHBlcmllbmNlcyIsCiAgICAgICAgICAgZ3JlcGwoImludGVyYWN0cyIsIHJlc3BvbnNlKSB+ICJpbnRlcmFjdHMgcGVvcGxlIiwKICAgICAgICAgICBncmVwbCgicHJlcHJvZ3JhbW1lZCIsIHJlc3BvbnNlKSB+ICJwcmVwcm9ncmFtbWVkIiwKICAgICAgICAgICBncmVwbCgib2JqZWN0cyIsIHJlc3BvbnNlKSB+ICJvYnNlcnZlcyBvYmplY3RzIiwKICAgICAgICAgICBncmVwbCgib2JzZXJ2ZXMgdGhlIHBlb3BsZSIsIHJlc3BvbnNlKSB+ICJvYnNlcnZlcyBwZW9wbGUiLAogICAgICAgICAgIGdyZXBsKCJib2R5IGdyb3dzIiwgcmVzcG9uc2UpIH4gImJvZHkgZ3Jvd3MiLAogICAgICAgICAgIGdyZXBsKCJicmFpbiBjaGFuZ2VzIiwgcmVzcG9uc2UpIH4gImJyYWluIGNoYW5nZXMiLAogICAgICAgICAgIGdyZXBsKCJzZW5zZXMgaW1wcm92ZSIsIHJlc3BvbnNlKSB+ICJzZW5zZXMgaW1wcm92ZSIpLAogICAgICAgICAgIGRldl9mYWN0b3IgPSBmYWN0b3IoCiAgICAgICAgICAgICBkZXZfZmFjdG9yLAogICAgICAgICAgICAgbGV2ZWxzID0gYyhnc3ViKCJfIiwgIiAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMoZF9kZXZfZmFjdG9yX3JhdGluZyRkZXZfZmFjdG9yKSksCiAgICAgICAgICAgICAgICAgICAgICAgICJvdGhlciIpKSkgJT4lCiAgICAgICAgIG11dGF0ZV9hdCh2YXJzKGNhcGFjaXR5LCByZXNwb25zZSksCiAgICAgICAgICAgICAgICAgICBmdW5zKGdzdWIoIl8iLCAiICIsIC4pKSksCiAgICAgICBhZXMoeCA9IGRldl9mYWN0b3IsIGZpbGwgPSBkb21haW4pKSArCiAgZmFjZXRfd3JhcCh+IGRvbWFpbiB+IGNhcGFjaXR5LCBuY29sID0gNCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBnZW9tX2JhcigpICsKICBsYWJzKHRpdGxlID0gIkNob2ljZSBvZiBtb3N0IGltcG9ydGFudCBkZXZlbG9wbWVudGFsIGZhY3RvciAoVmVyc2lvbiAxKSIsCiAgICAgICB4ID0gIkRldmVsb3BtZW50YWwgZmFjdG9yIiwgCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC43fQpkX2Rldl9mYWN0b3JfbW9zdF9pbXBvcnRhbnRfY2hvaWNlX290aGVyIDwtIGRfZGV2X2ZhY3Rvcl9tb3N0X2ltcG9ydGFudF9jaG9pY2UgJT4lIAogIGZpbHRlcihncmVwbCgiT3RoZXIiLCByZXNwb25zZSkpICU+JSAKICBjb3VudChkb21haW4sIGNhcGFjaXR5KQoKZ2dwbG90KGRfZGV2X2ZhY3Rvcl9tb3N0X2ltcG9ydGFudF9jaG9pY2UgJT4lCiAgICAgICAgIG11dGF0ZShkb21haW4gPSByZWNvZGVfZmFjdG9yKAogICAgICAgICAgIGRvbWFpbiwKICAgICAgICAgICAiQk9EIiA9ICJCb2RpbHkgc2Vuc2F0aW9ucyIsCiAgICAgICAgICAgIk5FRyIgPSAiTmVnYXRpdmUgZW1vdGlvbnMiLAogICAgICAgICAgICJQT1MiID0gIlNvY2lhbCBhYmlsaXRpZXMgJiBwb3NpdGl2ZSBlbW90aW9ucyIsCiAgICAgICAgICAgIkNPRyIgPSAiQ29nbml0aW9uICYgY29udHJvbCIsCiAgICAgICAgICAgLmRlZmF1bHQgPSBOQV9jaGFyYWN0ZXJfKSkgJT4lCiAgICAgICAgIG11dGF0ZShkZXZfZmFjdG9yID0gY2FzZV93aGVuKAogICAgICAgICAgIGdyZXBsKCJPdGhlciIsIHJlc3BvbnNlKSB+ICJvdGhlciIsCiAgICAgICAgICAgZ3JlcGwoInRlYWNoIiwgcmVzcG9uc2UpIH4gInBlb3BsZSB0ZWFjaCIsCiAgICAgICAgICAgZ3JlcGwoImV4cGVyaW1lbnRzIiwgcmVzcG9uc2UpIH4gImV4cGVyaW1lbnRzIiwKICAgICAgICAgICBncmVwbCgid29tYiIsIHJlc3BvbnNlKSB+ICJ3b21iIGV4cGVyaWVuY2VzIiwKICAgICAgICAgICBncmVwbCgiaW50ZXJhY3RzIiwgcmVzcG9uc2UpIH4gImludGVyYWN0cyBwZW9wbGUiLAogICAgICAgICAgIGdyZXBsKCJwcmVwcm9ncmFtbWVkIiwgcmVzcG9uc2UpIH4gInByZXByb2dyYW1tZWQiLAogICAgICAgICAgIGdyZXBsKCJvYmplY3RzIiwgcmVzcG9uc2UpIH4gIm9ic2VydmVzIG9iamVjdHMiLAogICAgICAgICAgIGdyZXBsKCJvYnNlcnZlcyB0aGUgcGVvcGxlIiwgcmVzcG9uc2UpIH4gIm9ic2VydmVzIHBlb3BsZSIsCiAgICAgICAgICAgZ3JlcGwoImJvZHkgZ3Jvd3MiLCByZXNwb25zZSkgfiAiYm9keSBncm93cyIsCiAgICAgICAgICAgZ3JlcGwoImJyYWluIGNoYW5nZXMiLCByZXNwb25zZSkgfiAiYnJhaW4gY2hhbmdlcyIsCiAgICAgICAgICAgZ3JlcGwoInNlbnNlcyBpbXByb3ZlIiwgcmVzcG9uc2UpIH4gInNlbnNlcyBpbXByb3ZlIiksCiAgICAgICAgICAgZGV2X2ZhY3RvciA9IGZhY3RvcigKICAgICAgICAgICAgIGRldl9mYWN0b3IsCiAgICAgICAgICAgICBsZXZlbHMgPSBjKGdzdWIoIl8iLCAiICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyhkX2Rldl9mYWN0b3JfcmF0aW5nJGRldl9mYWN0b3IpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIikpKSAlPiUKICAgICAgICAgbXV0YXRlX2F0KHZhcnMoY2FwYWNpdHksIHJlc3BvbnNlKSwKICAgICAgICAgICAgICAgICAgIGZ1bnMoZ3N1YigiXyIsICIgIiwgLikpKSAlPiUKICAgICAgICAgZmlsdGVyKGRldl9mYWN0b3IgIT0gIm90aGVyIiksCiAgICAgICBhZXMoeCA9IHJlb3JkZXIoY2FwYWNpdHksIGFzLm51bWVyaWMoZG9tYWluKSksIGZpbGwgPSBkb21haW4pKSArCiAgZmFjZXRfd3JhcCh+IGRldl9mYWN0b3IsIG5jb2wgPSA1KSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgZ2VvbV9iYXIoKSArCiAgbGFicyh0aXRsZSA9ICJDaG9pY2Ugb2YgbW9zdCBpbXBvcnRhbnQgZGV2ZWxvcG1lbnRhbCBmYWN0b3IgKFZlcnNpb24gMikiLAogICAgICAgc3VidGl0bGUgPSBwYXN0ZTAoIkV4Y2x1ZGluZyBhbnN3ZXJzIG9mICdvdGhlcicgKG4gPCAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG1heChkX2Rldl9mYWN0b3JfbW9zdF9pbXBvcnRhbnRfY2hvaWNlX290aGVyJG4pICsgMSwgIikgZm9yIGFueSBjYXBhY2l0eSIpLAogICAgICAgY29sb3IgPSAiRG9tYWluIiwKICAgICAgIHggPSAiQ2FwYWNpdHkgKGJ5IGRvbWFpbikiLCAKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmRfZGV2X2ZhY3Rvcl9tb3N0X2ltcG9ydGFudF9mcmVlICU+JQogIG11dGF0ZShkb21haW4gPSByZWNvZGVfZmFjdG9yKAogICAgZG9tYWluLAogICAgIkJPRCIgPSAiQm9kaWx5IHNlbnNhdGlvbnMiLAogICAgIk5FRyIgPSAiTmVnYXRpdmUgZW1vdGlvbnMiLAogICAgIlBPUyIgPSAiU29jaWFsIGFiaWxpdGllcyAmIHBvc2l0aXZlIGVtb3Rpb25zIiwKICAgICJDT0ciID0gIkNvZ25pdGlvbiAmIGNvbnRyb2wiLAogICAgLmRlZmF1bHQgPSBOQV9jaGFyYWN0ZXJfKSwKICAgIGNhcGFjaXR5ID0gZ3N1YigiXyIsICIgIiwgY2FwYWNpdHkpKSAlPiUKICBkaXN0aW5jdChkb21haW4sIGNhcGFjaXR5LCByZXNwb25zZSkgJT4lCiAgYXJyYW5nZShkb21haW4sIGNhcGFjaXR5LCByZXNwb25zZSkgJT4lCiAga2FibGUoY2FwdGlvbiA9ICJGcmVlIHJlc3BvbnNlcyB3aGVuICdvdGhlcicgd2FzIHNlbGVjdGVkIGFzIG1vc3QgaW1wb3J0YW50IGRldmVsb3BtZW50YWwgZmFjdG9yIikgJT4lCiAga2FibGVfc3R5bGluZygpICU+JQogIGNvbGxhcHNlX3Jvd3MoMToyKQpgYGAKCgojIFJlbGF0aW9uc2hpcHMgYmV0d2VlbiBkZXZlbG9wbWVudGFsIGZhY3RvciByYXRpbmdzIGFuZCBjYXBhY2l0eSByYXRpbmdzCgpgYGB7cn0KdGVtcCA8LSBkX2NhcF9yYXRpbmcgJT4lCiAgcmVuYW1lKHJlc3BvbnNlX2NhcF9yYXRpbmcgPSByZXNwb25zZSkgJT4lCiAgZnVsbF9qb2luKGRfZGV2X2ZhY3Rvcl9yYXRpbmdfYnljbHVzdCAlPiUKICAgICAgICAgICAgICByZW5hbWUocmVzcG9uc2VfZGV2X2ZhY3RvciA9IHJlc3BvbnNlKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDF9CmdncGxvdCh0ZW1wICU+JSBmaWx0ZXIodGFyZ2V0ID09ICJ0YXJnZXQwMG1vIiksCiAgICAgICBhZXMoeCA9IHJlc3BvbnNlX2Rldl9mYWN0b3IsIHkgPSByZXNwb25zZV9jYXBfcmF0aW5nLCAKICAgICAgICAgICBjb2xvciA9IGRvbWFpbiwgZ3JvdXAgPSBjYXBhY2l0eSkpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGRvbWFpbiwgY2FwYWNpdHkpLCAKICAgICAgICAgICAgIHJvd3MgPSB2YXJzKGRldl9mYWN0b3JfY2x1c3RlciwgZGV2X2ZhY3RvcikpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMikgKwogIGdlb21fc21vb3RoKGNvbG9yID0gImJsYWNrIiwgbWV0aG9kID0gImxtIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKwogIGxhYnModGl0bGUgPSAiUmVsYXRpb25zaGlwIGJldHdlZW4gZW5kb3JzZW1lbnQgb2YgZXh0cmluc2ljIHZzLiBpbnRyaW5zaWMgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIGFuZCBhdHRyaWJ1dGlvbnMgb2YgY2FwYWNpaXRlcyBhdCBiaXJ0aCIsCiAgICAgICB4ID0gIkVuZG9yc2VtZW50IG9mIGRldmVsb3BtZW50YWwgZmFjdG9yIiwKICAgICAgIHkgPSAiQ2FwYWNpdHkgYXR0cml1YnRpb24iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmFzcCA9IDAuM30KZ2dwbG90KHRlbXAsCiAgICAgICBhZXMoeCA9IHJlc3BvbnNlX2Rldl9mYWN0b3IsIHkgPSByZXNwb25zZV9jYXBfcmF0aW5nKSkgKwogIGZhY2V0X2dyaWQoZGV2X2ZhY3Rvcl9jbHVzdGVyIH4gdGFyZ2V0X29yZCkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4wMSwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBkZXZfZmFjdG9yLCBmaWxsID0gZGV2X2ZhY3RvciksIG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBsYWJzKHRpdGxlID0gIlJlbGF0aW9uc2hpcCBiZXR3ZWVuIGVuZG9yc2VtZW50IG9mIGV4dHJpbnNpYyB2cy4gaW50cmluc2ljIGRldmVsb3BtZW50YWwgZmFjdG9ycyBhbmQgYXR0cmlidXRpb25zIG9mIGNhcGFjaXRpZXMgYXQgdmFyaW91cyB0YXJnZXQgYWdlcyIsCiAgICAgICB4ID0gIkVuZG9yc2VtZW50IG9mIGRldmVsb3BtZW50YWwgZmFjdG9yIiwKICAgICAgIHkgPSAiQ2FwYWNpdHkgYXR0cml1YnRpb24iKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSAxMCwgZmlnLmFzcCA9IDAuNX0KZ2dwbG90KHRlbXAgJT4lIGZpbHRlcihkb21haW4gPT0gIkJPRCIpLAogICAgICAgYWVzKHggPSByZXNwb25zZV9kZXZfZmFjdG9yLCB5ID0gcmVzcG9uc2VfY2FwX3JhdGluZykpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGNhcGFjaXR5LCBkZXZfZmFjdG9yX2NsdXN0ZXIpLAogICAgICAgICAgICAgY29scyA9IHZhcnModGFyZ2V0X29yZCkpICsKICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMDQsIGNvbG9yID0gImdyYXkiKSArCiAgZ2VvbV9zbW9vdGgoYWVzKGNvbG9yID0gZGV2X2ZhY3RvciwgZmlsbCA9IGRldl9mYWN0b3IpLCBtZXRob2QgPSAibG0iKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFpcmVkIikgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iKSArCiAgbGFicyh0aXRsZSA9ICJCT0RJTFkgU0VOU0FUSU9OUzogUmVsYXRpb25zaGlwIGJldHdlZW4gZW5kb3JzZW1lbnQgb2YgZXh0cmluc2ljIHZzLiBpbnRyaW5zaWMgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIGFuZCBhdHRyaWJ1dGlvbnMgb2YgY2FwYWNpdGllcyBhdCB2YXJpb3VzIHRhcmdldCBhZ2VzIiwKICAgICAgIHggPSAiRW5kb3JzZW1lbnQgb2YgZGV2ZWxvcG1lbnRhbCBmYWN0b3IiLAogICAgICAgeSA9ICJDYXBhY2l0eSBhdHRyaXVidGlvbiIpCmBgYAoKYGBge3IsIGZpZy53aWR0aCA9IDEwLCBmaWcuYXNwID0gMC41fQpnZ3Bsb3QodGVtcCAlPiUgZmlsdGVyKGRvbWFpbiA9PSAiTkVHIiksCiAgICAgICBhZXMoeCA9IHJlc3BvbnNlX2Rldl9mYWN0b3IsIHkgPSByZXNwb25zZV9jYXBfcmF0aW5nKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoY2FwYWNpdHksIGRldl9mYWN0b3JfY2x1c3RlciksCiAgICAgICAgICAgICBjb2xzID0gdmFycyh0YXJnZXRfb3JkKSkgKwogIGdlb21faml0dGVyKGFscGhhID0gMC4wNCwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX3Ntb290aChhZXMoY29sb3IgPSBkZXZfZmFjdG9yLCBmaWxsID0gZGV2X2ZhY3RvciksIG1ldGhvZCA9ICJsbSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYWlyZWQiKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIpICsKICBsYWJzKHRpdGxlID0gIk5FR0FUSVZFIEVNT1RJT05TOiBSZWxhdGlvbnNoaXAgYmV0d2VlbiBlbmRvcnNlbWVudCBvZiBleHRyaW5zaWMgdnMuIGludHJpbnNpYyBkZXZlbG9wbWVudGFsIGZhY3RvcnMgYW5kIGF0dHJpYnV0aW9ucyBvZiBjYXBhY2l0aWVzIGF0IHZhcmlvdXMgdGFyZ2V0IGFnZXMiLAogICAgICAgeCA9ICJFbmRvcnNlbWVudCBvZiBkZXZlbG9wbWVudGFsIGZhY3RvciIsCiAgICAgICB5ID0gIkNhcGFjaXR5IGF0dHJpdWJ0aW9uIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5hc3AgPSAwLjV9CmdncGxvdCh0ZW1wICU+JSBmaWx0ZXIoZG9tYWluID09ICJQT1MiKSwKICAgICAgIGFlcyh4ID0gcmVzcG9uc2VfZGV2X2ZhY3RvciwgeSA9IHJlc3BvbnNlX2NhcF9yYXRpbmcpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhjYXBhY2l0eSwgZGV2X2ZhY3Rvcl9jbHVzdGVyKSwKICAgICAgICAgICAgIGNvbHMgPSB2YXJzKHRhcmdldF9vcmQpKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjA0LCBjb2xvciA9ICJncmF5IikgKwogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9IGRldl9mYWN0b3IsIGZpbGwgPSBkZXZfZmFjdG9yKSwgbWV0aG9kID0gImxtIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGxhYnModGl0bGUgPSAiUE9TSVRJVkUgRU1PVElPTlMgJiBTT0NJQUwgQUJJTElUSUVTOiBSZWxhdGlvbnNoaXAgYmV0d2VlbiBlbmRvcnNlbWVudCBvZiBleHRyaW5zaWMgdnMuIGludHJpbnNpYyBkZXZlbG9wbWVudGFsIGZhY3RvcnMgYW5kIGF0dHJpYnV0aW9ucyBvZiBjYXBhY2l0aWVzIGF0IHZhcmlvdXMgdGFyZ2V0IGFnZXMiLAogICAgICAgeCA9ICJFbmRvcnNlbWVudCBvZiBkZXZlbG9wbWVudGFsIGZhY3RvciIsCiAgICAgICB5ID0gIkNhcGFjaXR5IGF0dHJpdWJ0aW9uIikKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gMTAsIGZpZy5hc3AgPSAwLjV9CmdncGxvdCh0ZW1wICU+JSBmaWx0ZXIoZG9tYWluID09ICJDT0ciKSwKICAgICAgIGFlcyh4ID0gcmVzcG9uc2VfZGV2X2ZhY3RvciwgeSA9IHJlc3BvbnNlX2NhcF9yYXRpbmcpKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhjYXBhY2l0eSwgZGV2X2ZhY3Rvcl9jbHVzdGVyKSwKICAgICAgICAgICAgIGNvbHMgPSB2YXJzKHRhcmdldF9vcmQpKSArCiAgZ2VvbV9qaXR0ZXIoYWxwaGEgPSAwLjA0LCBjb2xvciA9ICJncmF5IikgKwogIGdlb21fc21vb3RoKGFlcyhjb2xvciA9IGRldl9mYWN0b3IsIGZpbGwgPSBkZXZfZmFjdG9yKSwgbWV0aG9kID0gImxtIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhaXJlZCIpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikgKwogIGxhYnModGl0bGUgPSAiQ09HTklUSU9OICYgQ09OVFJPTDogUmVsYXRpb25zaGlwIGJldHdlZW4gZW5kb3JzZW1lbnQgb2YgZXh0cmluc2ljIHZzLiBpbnRyaW5zaWMgZGV2ZWxvcG1lbnRhbCBmYWN0b3JzIGFuZCBhdHRyaWJ1dGlvbnMgb2YgY2FwYWNpdGllcyBhdCB2YXJpb3VzIHRhcmdldCBhZ2VzIiwKICAgICAgIHggPSAiRW5kb3JzZW1lbnQgb2YgZGV2ZWxvcG1lbnRhbCBmYWN0b3IiLAogICAgICAgeSA9ICJDYXBhY2l0eSBhdHRyaXVidGlvbiIpCmBgYAoKCiMgRGVtb2dyYXBoaWNzCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBEdXJhdGlvbi82MCkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRfZGVtbyREdXJhdGlvbi82MCksIGNvbG9yID0gImJsdWUiLCBsdHkgPSAyKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAxMDAwMCwgNCkpICsKICBsYWJzKHRpdGxlID0gIkR1cmF0aW9uIG9mIHN0dWR5IChhY2NvcmRpbmcgdG8gUXVhbHRyaWNzKSIsCiAgICAgICBzdWJ0aXRsZSA9ICJCbHVlIGRvdHRlZCBsaW5lIG1hcmtzIG1lZGlhbiIsCiAgICAgICB4ID0gIkR1cmF0aW9uIChpbiBtaW51dGVzKSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEFnZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAyKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRfZGVtbyRBZ2UpLCBjb2xvciA9ICJibHVlIiwgbHR5ID0gMikgKwogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMTAwMDAsIDQpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBhZ2UgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHN1YnRpdGxlID0gIkJsdWUgZG90dGVkIGxpbmUgbWFya3MgbWVkaWFuIiwKICAgICAgIHggPSAiQWdlIChpbiB5ZWFycykiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7cn0KZ2dwbG90KGRfZGVtbywgYWVzKHggPSBHZW5kZXJTZXgpKSArIAogIGdlb21fYmFyKCkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgZ2VuZGVyL3NleCAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJHZW5kZXIvc2V4IiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gZ3N1YignKC57MSwzMH0pKFxcc3wkKScsICdcXDFcbicsIFJhY2VFdGhuaWNpdHlfY29sbGFwc2UpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IHJhY2UvZXRobmljaXR5IChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIlJhY2UvZXRobmljaXR5IiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gRmlyc3RMYW5nKSkgKyAKICBnZW9tX2JhcigpICsKICBsYWJzKHRpdGxlID0gIlBhcnRpY3BpYW50IGZpcnN0IGxhbmd1YWdlIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkxhbmd1YWdlIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gZmFjdG9yKEVkdWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gbGV2ZWxzKGQkRWR1Y2F0aW9uKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZ3N1YignKC57MSwzMH0pKFxcc3wkKScsICdcXDFcbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyhkJEVkdWNhdGlvbikpKSkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBlZHVjYXRpb25hbCBhdHRhaW5tZW50IChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkhpZ2hlc3QgbGV2ZWwgb2YgZWR1Y2F0aW9uIGNvbXBsZXRlZCIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IEluY29tZSkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBob3VzZWhvbGQgaW5jb21lIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkFubnVhbCBob3VzZWhvbGQgaW5jb21lIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gSG91c2Vob2xkU2l6ZSkpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRfZGVtbyRIb3VzZWhvbGRTaXplKSwgY29sb3IgPSAiYmx1ZSIsIGx0eSA9IDIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwLCAxKSkgKwogIGxhYnModGl0bGUgPSAiUGFydGljcGlhbnQgaG91c2Vob2xkIHNpemUgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHN1YnRpdGxlID0gIkJsdWUgZG90dGVkIGxpbmUgbWFya3MgbWVkaWFuIiwKICAgICAgIHggPSAiTnVtYmVyIG9mIHBlb3BsZSBpbiBob3VzZWhvbGQgKGFkdWx0cyBhbmQgY2hpbGRyZW4pIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIHBhcnRpY2lwYW50cyIpCmBgYAoKYGBge3J9CmdncGxvdChkX2RlbW8sIGFlcyh4ID0gTWFyaXRhbFN0YXR1cykpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBtYXJpdGFsIHN0YXR1cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJNYXJpdGFsIHN0YXR1cyIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vLCBhZXMoeCA9IFBhcmVudCkpICsgCiAgZ2VvbV9iYXIoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxLCB2anVzdCA9IDEpKSArCiAgbGFicyh0aXRsZSA9ICJQYXJ0aWNwaWFudCBwYXJlbnQgc3RhdHVzIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICBzdWJ0aXRsZSA9ICInTkEnIGluZGljYXRlcyByZXNwb25zZSBvZiAnUHJlZmVyIG5vdCB0byBzYXknIiwKICAgICAgIHggPSAiUGFyZW50IHN0YXR1cyIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vICU+JSBmaWx0ZXIoUGFyZW50ID09ICJZZXMiKSwgYWVzKHggPSBDaGlsZHJlbk51bWJlcikpICsgCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gbWVkaWFuKGRfZGVtb1tkX2RlbW8kUGFyZW50ID09ICJZZXMiLF0kQ2hpbGRyZW5OdW1iZXIsIG5hLnJtID0gVCksIAogICAgICAgICAgICAgY29sb3IgPSAiYmx1ZSIsIGx0eSA9IDIpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDEwMDAwLCAxKSkgKwogIGxhYnModGl0bGUgPSAiTnVtYmVyIG9mIGNoaWxkcmVuIGFtb25nIHBhcmVudHMgKHNlbGYtcmVwb3J0ZWQpIiwKICAgICAgIHN1YnRpdGxlID0gIkJsdWUgZG90dGVkIGxpbmUgbWFya3MgbWVkaWFuIiwKICAgICAgIHggPSAiTnVtYmVyIG9mIGNoaWxkcmVuIChhbW9uZyBwYXJlbnRzKSIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vICU+JSBmaWx0ZXIoUGFyZW50ID09ICJZZXMiKSwgCiAgICAgICBhZXMoeCA9IGZhY3RvcihDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlKSwKICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGdzdWIoJyguezEsMzB9KShcXHN8JCknLCAnXFwxXG4nLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzKGRfZGVtbyRDaGlsZHJlbllvdW5nZXN0QWdlX2NvbGxhcHNlKSkpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIkFnZSBvZiB5b3VuZ2VzdCBjaGlsZCBhbW9uZyBwYXJlbnRzIChzZWxmLXJlcG9ydGVkKSIsCiAgICAgICB4ID0gIkFnZSBvZiBjaGlsZCIsCiAgICAgICB5ID0gIk51bWJlciBvZiBwYXJ0aWNpcGFudHMiKQpgYGAKCmBgYHtyfQpnZ3Bsb3QoZF9kZW1vICU+JSBmaWx0ZXIoUGFyZW50ID09ICJZZXMiKSwgCiAgICAgICBhZXMoeCA9IGZhY3RvcihDaGlsZHJlbk9sZGVzdEFnZV9jb2xsYXBzZSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGxldmVscyhkX2RlbW8kQ2hpbGRyZW5PbGRlc3RBZ2VfY29sbGFwc2UpLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gZ3N1YignKC57MSwzMH0pKFxcc3wkKScsICdcXDFcbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMoZF9kZW1vJENoaWxkcmVuT2xkZXN0QWdlX2NvbGxhcHNlKSkpKSkgKyAKICBnZW9tX2JhcigpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSkpICsKICBsYWJzKHRpdGxlID0gIkFnZSBvZiBvbGRlc3QgY2hpbGQgYW1vbmcgcGFyZW50cyAoc2VsZi1yZXBvcnRlZCkiLAogICAgICAgeCA9ICJBZ2Ugb2YgY2hpbGQiLAogICAgICAgeSA9ICJOdW1iZXIgb2YgcGFydGljaXBhbnRzIikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmRfZGVtbyAlPiUKICBkaXN0aW5jdChDb21tZW50cykgJT4lCiAgbXV0YXRlKENvbW1lbnRzID0gZ3N1YigiICQiLCAiIiwgQ29tbWVudHMpLAogICAgICAgICBDb21tZW50cyA9IGdzdWIoIlxcISQiLCAiIiwgQ29tbWVudHMpLAogICAgICAgICBDb21tZW50cyA9IGdzdWIoIlxcLiQiLCAiIiwgQ29tbWVudHMpKSAlPiUKICBmaWx0ZXIodG9sb3dlcihDb21tZW50cykgIT0gIm4vYSIsIAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibmEiLAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibm8iLCAKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5vIGNvbW1lbnQiLAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibm8gY29tbWVudHMiLCAKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5vIGFkZGl0aW9uYWwgY29tbWVudHMiLCAKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5pbCIsIAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibm8gb3RoZXIgY29tbWVudHMiLAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibm8gZnVydGhlciByZW1hcmtzIiwgCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJubyB0aGFuayB5b3UiLCAKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5vIHRoZXJlIGlzIG5vdC4gdGhhbmtzIiwgCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJub25lIiwKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5vbmUuIHRoYW5rIHlvdSIsIAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAibm9uZSwgdGhhbmsgeW91IiwgCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJub3BlLCB0aGFuayB5b3UgZm9yIGxldHRpbmcgbWUgdGFrZSB0aGlzIiwKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gIm5vdGhpbmcgYXQgdGhlIG1vbWVudCIsCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJ0aGFuayB5b3UiLAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAidGhhbmsgeW91IGZvciB0aGUgb3Bwb3J0dW5pdHkgdG8gdGFrZSBwYXJ0IGluIHRoaXMgc3R1ZHkiLAogICAgICAgICB0b2xvd2VyKENvbW1lbnRzKSAhPSAidGhhbmsgeW91IGZvciB0aGlzIG9wcG9ydHVuaXR5IiwKICAgICAgICAgdG9sb3dlcihDb21tZW50cykgIT0gInRoYW5rcyIsCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJ0aGFua3MgZm9yIHRoZSBvcHBvcnR1bml0eSBhbmQgZ29vZCBsdWNrIHdpdGggeW91ciByZXNlYXJjaCIsCiAgICAgICAgIHRvbG93ZXIoQ29tbWVudHMpICE9ICJ0aGFua3MgZm9yIHRoZSBvcHBvcnR1bml0eSIpICU+JQogIGFycmFuZ2UoQ29tbWVudHMpICU+JQogIGthYmxlKGNhcHRpb24gPSAiRnJlZSByZXNwb25zZXMgdG8gb3B0aW9uYWwgJ2NvbW1lbnRzJyBmaWVsZCAoZXhjbHVkaW5nIGFuc3dlcnMgbGlrZSAnTi9BLCcgJ25vLCcgJ25vdCB0aGF0IEkgY2FuIHRoaW5rIG9mJywgJ3RoYW5rIHlvdScsIGV0Yy4sIHdoZW4gdGhleSB3ZXJlIGVhc3kgdG8gZXhjbHVkZSkiKSAlPiUKICBrYWJsZV9zdHlsaW5nKCkKYGBgCg==